Menampilkan Progress Dialog Yang Lebih Canggih

Selain progress dialog sederhana yang sudah kita buat sebelumnya, kita juga bisa membuat dialog yang menampilkan progress suatu pekerjaan yang lebih informatif, misalnya status download. Berikut adalah contoh latihan yang menampilkan progress download.

1. Kita masih menggunakan project yang sama dengan sebelumnya. Kita modifikasi file layout "activity_main.xml" seperti berikut:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.fragmentdialog.MainActivity">


<Button
android:id="@+id/btn_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click to display a dialog"
android:onClick="onClick"/>

<Button
android:id="@+id/btn_dialog2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click untuk menampilkan progress dialog"
android:onClick="onClick2"/>

<Button
android:id="@+id/btn_dialog3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click untuk menampilkan detil progress dialog"
android:onClick="onClick3"/>

</LinearLayout>

2. Kita modifikasi fie utama "MainActivity.java" seperti berikut:
package com.example.fragmentdialog;

import android.app.FragmentManager;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

FragmentManager fm = getFragmentManager();
MyDF dialogFragment = new MyDF();

ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClick(View v) {
dialogFragment.show(fm, "Dialog");
}

public void onClick2(View v) {
/*menampilkan dialog*/
final ProgressDialog dialog = ProgressDialog.show(
this, "Sedang melakukan sesuatu", "Silahkan tunggu...", true);
new Thread(new Runnable() {
@Override
public void run() {
try {
/*mensimulasikan sesuatu proses yg lama*/
Thread.sleep(5000);
/*hentikan dialog*/
dialog.dismiss();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}

public void onClick3(View v) {
progressDialog = new ProgressDialog(this);
progressDialog.setIcon(R.drawable.ic_launcher);
progressDialog.setTitle("Sedang download file...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton)
{
Toast.makeText(getBaseContext(), "OK clicked!", Toast.LENGTH_SHORT).show();
}
});
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton)
{
Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show();
}
});

progressDialog.setProgress(0);
progressDialog.show();

new Thread(new Runnable() {
@Override
public void run() {
for (int i=1; i<=15; i++) {
try {
/*mensimulasikan sesuatu yang lama*/
Thread.sleep(1000);
/*update dialog*/
progressDialog.incrementProgressBy((int)(100/15));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressDialog.dismiss();
}
}).start();
}
}
3. Jalankan di emulator Android Studio dan hasilnya adalah seperti berikut:



Penjelasan

Untuk membuat dialog yang menunjukkan progress suatu pengerjaan, kita pertama kali membuat instans dari class ProgressDialog dan men-set berbagai properti-propertinya seperti icon, title, dan style:
progressDialog = new ProgressDialog(this);
progressDialog.setIcon(R.drawable.ic_launcher);
progressDialog.setTitle("Sedang download file...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
Kita kemudian men-set dua tombol yang ingin ditampilkan dalam progress dialog:
progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton)
{
Toast.makeText(getBaseContext(), "OK clicked!", Toast.LENGTH_SHORT).show();
}
});
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton)
{
Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show();
}
});
Untuk menampilkan status progress dalam progress dialog, kita bisa menggunakan object 'Thread' untuk menjalankan blok kode 'Runnable':
progressDialog.setProgress(0);
progressDialog.show();

new Thread(new Runnable() {
@Override
public void run() {
for (int i=1; i<=15; i++) {
try {
/*mensimulasikan sesuatu yang lama*/
Thread.sleep(1000);
/*update dialog*/
progressDialog.incrementProgressBy((int)(100/15));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressDialog.dismiss();
}
}).start();
Dalam hal ini, kta ingin menghitung dari 1 sampai 15 dengan delay satu detik diantara masing-masing angka. Method 'incrementProgressBy()' akan membuat increment dalam progress dialog. Ketika progress dialog mencapai 100% dia akan berhenti.

No comments: