ProgressBar — отображаем индикатор прогресса задачи

| 12.08.2014

ProgressBar позволяет визуально отобразить, на какой стадии находится выполняемая задача (например, закачивание ресурсов, копирование файлов, наполнение базы данных и пр.). Здесь мы рассмотрим пример создания ProgressBar-а в «попапе» (в виде диалога), где будем отображать процент выполнения и суммарный «объем» задачи в цифровом отображении.

ProgressBar - отображаем индикатор прогресса задачи

Выполнение задачи будет происходить от 0 до 70, т.е. 70 — это 100% выполнение. По сути, 70 в нашем примере — это количество итераций в цикле, на каждом шаге которого мы будем делать паузу в полсекунды и обновлять статус ProgressBar-а.

Добавим простой макет — LinearLayout с одной кнопкой. При нажатии на кнопку будем запускать нашу задачу (метод startProgress()) с отображением Прогресс Бара в виде диалога.

res/layout/activity_main.xml

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Progress"
        android:onClick="startProgress"
        android:id="@+id/button" />

</LinearLayout>

ProgressBar - отображаем индикатор прогресса задачи

Добавим MainActivity.java

package ru.androiddocs.progressbar;

import android.app.ProgressDialog;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends ActionBarActivity {

    private ProgressDialog mDialog;
    private final int mTotalTime = 70;

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

    public void startProgress(View v) {
        mDialog = new ProgressDialog(this);
        mDialog.setMessage(getResources().getString(R.string.executing_task));
        mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mDialog.setProgress(0);
        mDialog.setMax(mTotalTime);
        mDialog.show();

        new Thread(new Runnable() {
            @Override
            public void run(){
                int counter = 0;
                while(counter < mTotalTime){
                    try {
                        Thread.sleep(500);
                        counter ++;
                        mDialog.setProgress(counter);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                mDialog.dismiss();
            }
        }).start();
    }
}

Итак, в методе startProgress() мы создаем экземпляр класса ProgressDialog, передавая конструктору в качестве параметра текущий контекст. С помощью метода setMessage() добавляем свой заголовок для попапа. Устанавливаем стиль отображения прогресс-бара (setProgressStyle()), обнуляем текущий прогресс — setProgress(0) и устанавливаем максимальное значение «прогресса» — setMax(). Методом show() отображаем ProgressBar. Сразу же запускаем нашу задачу в отдельном потоке.

Внутри потока — конструкция while, которая будет выполняться до тех пор, пока наш счетчик counter не достигнет максимума mTotalTime. Перед каждый увеличением счетчика на 1 мы делаем паузу в полсекунды, а после увеличения — обновляем статус прогресса методом setProgress(counter), передавая текущее значение счетчика.

Как я уже писал ранее, внутри данного потока может быть любая задача, но мы вместо этого просто делаем небольшую паузу. Когда счетчик достигнет своего максимума (70), т.е. задача выполнится, мы закрываем диалог методом dismiss().

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*