Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
ProgressDialog представляет собой диалоговое окно с индикатором прогресса. В диалоговое окно также можно добавлять дополнительные элементы управления, например, кнопки для отмены задачи.
Для создания диалогового окна с индикатором прогресса необходимо инициализировать объект ProgressDialog через вызов конструктора класса ProgressDialog(Context), передав ему в качестве параметра контекст текущей деятельности. Далее нужно установить нужные свойства диалогового окна: стиль, сообщения и т.д.
У индикатора прогресса можно установить два стиля - горизонтальный и в виде вращающейся окружности. Давайте перейдём к примеру. Добавим в проект две кнопки для вызова диалоговых окон с индикаторами прогресса двух стилей и напишем следующий код:
@Override
protected Dialog onCreateDialog(int id)
{
switch (id)
{
case IDD__HORIZONTAL_PROGRESS:
mProgressDialog = new ProgressDialog(
ProgressDialogDemoActivity.this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // устанавливаем стиль
mProgressDialog.setMessage("Загружаю. Подождите..."); // задаем текст
return mProgressDialog;
case IDD_WHEEL_PROGRESS:
mProgressDialog = new ProgressDialog(
ProgressDialogDemoActivity.this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setMessage("Загружаю. Подождите...");
return mProgressDialog;
default:
return null;
}
}
Запустив проект, вы увидите два разных индикатора прогресса. Причём первый горизонтальный индикатор прогресса будет совсем скучный - никакой анимации и никаких изменений. Второй индикатор чуть поживее, так как можно увидеть анимацию окружности. Он применяется в том случае, когда процент выполнения не важен. А для горизонтального индикатора необходимо самостоятельно позаботиться об анимации и выводе процентов выполнения задачи. Мы решим данную задачу в следующем примере.
Настоятельно рекомендуется длительные задачи выносить в другой поток и сообщать о прогрессе его выполнения назад в основной поток деятельности через объект Handler. Для демонстрации я взял кусок кода из официальной страницы разработчиков Android. Добавим к проекту кнопку.
protected Dialog onCreateDialog(int id)
{
switch (id)
{
case IDD_THREAD_PROGRESS:
mProgressDialog = new ProgressDialog(
ProgressDialogDemoActivity.this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setMessage("Загружаю. Подождите...");
return mProgressDialog;
default:
return null;
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog)
{
switch(id)
{
case IDD_THREAD_PROGRESS:
mProgressDialog.setProgress(0);
progressThread = new ProgressThread(handler);
progressThread.start();
}
}
// Define the Handler that receives messages from the thread and update the progress
final Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
int total = msg.arg1;
mProgressDialog.setProgress(total);
if (total >= 100)
{
dismissDialog(IDD_THREAD_PROGRESS);
progressThread.setState(ProgressThread.STATE_DONE);
}
}
};
/* Nested class that performs progress calculations (counting) */
private class ProgressThread extends Thread
{
Handler mHandler;
final static int STATE_DONE = 0;
final static int STATE_RUNNING = 1;
int mState;
int total;
ProgressThread(Handler h)
{
mHandler = h;
}
public void run()
{
mState = STATE_RUNNING;
total = 0;
while (mState == STATE_RUNNING)
{
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
Log.e("ERROR", "Thread Interrupted");
}
Message msg = mHandler.obtainMessage();
msg.arg1 = total;
mHandler.sendMessage(msg);
total++;
}
}
/* sets the current state for the thread,
* used to stop the thread */
public void setState(int state)
{
mState = state;
}
}
Запустив проект, вы увидите, что полоска индикатора прогресса закрашивается и по достижении отметки 100% закрывает диалоговое окно, и мы возвращаемся в основное окно программы.
По умолчанию, окно диалога выводится по центру экрана. Можете определить другую позицию.
ProgressDialog myDialog =
ProgressDialog.show(MainActivity.this, "Важная информация","снизу...", true);
myDialog.getWindow().setGravity(Gravity.BOTTOM);