Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

ProgressDialog - Диалог с индикатором прогресса

Класс объявлен устаревшим в API 26

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;
	}
}

Запустив проект, вы увидите два разных индикатора прогресса. Причём первый горизонтальный индикатор прогресса будет совсем скучный - никакой анимации и никаких изменений. Второй индикатор чуть поживее, так как можно увидеть анимацию окружности. Он применяется в том случае, когда процент выполнения не важен. А для горизонтального индикатора необходимо самостоятельно позаботиться об анимации и выводе процентов выполнения задачи. Мы решим данную задачу в следующем примере.

ProgressDialog  в виде окружности

Выполнение задачи в другом потоке

Настоятельно рекомендуется длительные задачи выносить в другой поток и сообщать о прогрессе его выполнения назад в основной поток деятельности через объект 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

Исходный код к статье

По умолчанию, окно диалога выводится по центру экрана. Можете определить другую позицию.


ProgressDialog myDialog = 
ProgressDialog.show(MainActivity.this, "Важная информация","снизу...", true);
myDialog.getWindow().setGravity(Gravity.BOTTOM);
Реклама