В этом уроке мы создадим ProgressDialog
, а также рассмотрим роль ProgressBar
в ProgressDialog
.
Диалоги в Android. ProgressDialog
ProgressDialog
является расширением виджета AlertDialog
(подробнее о AlertDialog).
ProgressDialog
в Android представляет собой диалоговое окно с ходом (прогрессом) выполнения какой-то задачи. Сам ProgressDialog
очень похож на ProgressBar
за исключением того, что отображается в диалоговом окне. Чтобы создать ProgressDialog
, нужно достаточно следующей строчки кода:
1 |
ProgressDialog progressDialog = new ProgressDialog(this); |
Разница между ProgressDialog и ProgressBar
ProgressBar
представляет собой обычныйView
(как Button, ImageView и другие) и может быть использован в макете, чтобы показать прогресс выполнения какой-то задачи. Кроме того, он не мешает пользователю взаимодействовать с другими частями приложения.ProgressDialog
представляет собой диалог со встроеннымProgressBar
. Он также используется, чтобы показать прогресс выполнения какой-то задачи, но закрывает пользователю доступ к другим элементам экрана и требует дождаться выполнения задачи.
Методы для работы с диалогом ProgressDialog
- Метод
setMessage()
используется для отображения сообщения пользователю. В нем часто пишут что-то на подобии «Идет загрузка…». - Метод
setTitle()
используется для установки заголовка в диалог. - Метод
setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
используется для указания горизонтального индикатора выполнения в диалоговом окне. - Метод
setProgressStyle(ProgressDialog.STYLE_SPINNER)
используется для демонстрации пользователю прогресса выполнения какой-либо задачи в виде вращающегося индикатора. - Метод
setMax()
используется для установки максимального значения прогресса. - Метод
getMax()
возвращает максимальное значение прогресса. - Метод
getProgress()
используется для получения текущего значения прогресса в цифрах. - Статический метод
show(Context context, CharSequence title, CharSequence message)
используется для отображения диалогаProgressDialog
на экране. - Метод
incrementProgressBy(int diff)
увеличивает индикатор на значение, переданное в качестве параметраdiff
.
Пример работы с ProgressDialog
Ниже мы рассмотри небольшой пример работы с диалогом ProgressDialog
.
Наш XML макет:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <Button android:id="@+id/btn_start_horiz_dialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/horizontal_dialog" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:id="@+id/btn_start_simple_dialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/simple_dialog" android:layout_below="@+id/btn_start_horiz_dialog" android:layout_centerHorizontal="true" /> </RelativeLayout> |
Листинг класса MainActivity:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
package ua.com.prologistic; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btnHorizontalDialog; Button btnSimpleDialog; ProgressDialog progressDialog; Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnHorizontalDialog = (Button) findViewById(R.id.btn_start_horiz_dialog); btnSimpleDialog = (Button) findViewById(R.id.btn_start_simple_dialog); btnSimpleDialog.setOnClickListener(this); btnHorizontalDialog.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start_simple_dialog: { // создает простой диалог с бесконечной анимацией // (пока не нажали на кнопку Ок) progressDialog = new ProgressDialog(this); progressDialog.setMax(100); progressDialog.setMessage("Идет загрузка..."); progressDialog.setTitle("Пример работы ProgressDialog"); progressDialog.setButton(Dialog.BUTTON_POSITIVE, "Oк", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); progressDialog.show(); break; } case R.id.btn_start_horiz_dialog: { progressDialog = new ProgressDialog(this); progressDialog.setMax(100); progressDialog.setMessage("Идет загрузка..."); progressDialog.setTitle("Пример работы ProgressDialog"); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.show(); handler = new Handler() { public void handleMessage(Message msg) { // и обновляем идикатор, пока шкала не заполнится if (progressDialog.getProgress() < progressDialog.getMax()) { // обновляем индикаторы на 3 пункта за 1 секунду (1000 милисекунд) progressDialog.incrementProgressBy(3); handler.sendEmptyMessageDelayed(0, 1000); } else { // когда шкала заполнилась, диалог пропадает progressDialog.dismiss(); } } }; // имитируем подключение к удаленному серверу // (ожидаем 1 секунду перед стартом обновления индикатора) handler.sendEmptyMessageDelayed(0, 1000); break; } } } } |
В нашем приложении использовался Handler — механизм, позволяющий обрабатывать очередь из сообщений. Мы можем отправлять, получать сообщения, задавать интервалы получения этих сообщений самому себе. Подробно с этим механизмом мы разберемся в следующих уроках, а пока достаточно того, что он позволяет обновлять индикатор не в своем потоке.
Результат работы приложения с использованием ProgressDialog:
Следите за обновлениями и подписывайтесь на рассылку новых статей по Java и Android.