Использования ProgressBar в Android

В Android ProgressBar — это элемент пользовательского интерфейса, который отображает ход выполнения задачи, которая может занимать некоторое время. Он помогает пользователю понимать, что приложение занято выполнением работы, и уменьшает вероятность того, что пользователь решит, что приложение "зависло".

Виды ProgressBar

В Android существует два основных типа ProgressBar:

  1. Индикатор выполнения с неопределённым прогрессом (Indeterminate ProgressBar): Используется, когда точное время завершения задачи неизвестно. В данном случае ProgressBar показывает, что задача выполняется, но не сообщает, сколько времени или усилий осталось до завершения.

    Пример: Загрузка данных из сети, где неизвестно, сколько времени займет операция.

  2. Индикатор выполнения с определённым прогрессом (Determinate ProgressBar): Этот тип ProgressBar используется, когда задача имеет известный прогресс, и вы можете обновлять его по мере выполнения задачи. Примером может быть процесс скачивания файла, где известно, сколько процентов файла загружено.

Определение ProgressBar в XML

1. Индикатор с неопределённым прогрессом:

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminate="true"/>

Это пример простого неопределённого индикатора прогресса. Здесь свойство android:indeterminate="true" указывает, что индикатор должен работать в неопределённом режиме.

2. Индикатор с определённым прогрессом:

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="100"
    android:progress="0"/>

Здесь:

  • progressBarStyleHorizontal — это стиль горизонтального индикатора прогресса.
  • android:max="100" — максимальное значение прогресса (в процентах).
  • android:progress="0" — начальный прогресс (0%).

Программное управление ProgressBar

Установка прогресса программно

Для обновления прогресса из кода можно использовать методы setProgress() и setMax(). Например:

val progressBar = findViewById<ProgressBar>(R.id.progressBar)
progressBar.max = 100
progressBar.progress = 50

Этот код задает максимальное значение в 100 и устанавливает прогресс на 50%.

Управление видимостью

Часто необходимо отображать ProgressBar только тогда, когда выполняется задача, а затем скрывать его. Для этого используются свойства View.VISIBLE, View.INVISIBLE и View.GONE.

progressBar.visibility = View.VISIBLE // Показать индикатор
// Выполнение задачи...
progressBar.visibility = View.GONE // Скрыть индикатор после завершения

Работа с индикатором в фоновом потоке

Когда выполняется долгий процесс (например, сетевой запрос), чтобы не блокировать основной поток (UI thread), работу стоит выполнять в фоновом потоке. Для этой цели можно использовать AsyncTask, Handler, Thread или Kotlin Coroutines.

Пример с использованием AsyncTask:

class DownloadTask(val progressBar: ProgressBar) : AsyncTask<Void, Int, Void>() {

    override fun onPreExecute() {
        super.onPreExecute()
        progressBar.visibility = View.VISIBLE
    }

    override fun doInBackground(vararg params: Void?): Void? {
        for (i in 1..100) {
            Thread.sleep(50) // Симуляция выполнения работы
            publishProgress(i) // Обновление прогресса
        }
        return null
    }

    override fun onProgressUpdate(vararg values: Int?) {
        super.onProgressUpdate(*values)
        progressBar.progress = values[0] ?: 0
    }

    override fun onPostExecute(result: Void?) {
        super.onPostExecute(result)
        progressBar.visibility = View.GONE
    }
}

Этот пример симулирует выполнение задачи с отображением прогресса. Прогресс обновляется в фоновом потоке, а в основном потоке UI обновляется через onProgressUpdate().

Пример с Kotlin Coroutines

Использование Kotlin Coroutines для фоновых задач стало более популярным. Пример использования:

import kotlinx.coroutines.*

fun updateProgress(progressBar: ProgressBar) {
    progressBar.visibility = View.VISIBLE

    GlobalScope.launch(Dispatchers.Main) {
        for (i in 1..100) {
            delay(50) // Симуляция выполнения работы
            progressBar.progress = i
        }
        progressBar.visibility = View.GONE
    }
}

Коррутины облегчают работу с асинхронными задачами, и их использование снижает вероятность утечек памяти по сравнению с AsyncTask.

Кастомизация ProgressBar

ProgressBar можно кастомизировать, чтобы он лучше соответствовал дизайну приложения. Например, можно изменить цвет и форму индикатора.

Пример кастомизации через XML:

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progressDrawable="@drawable/custom_progress_drawable"
    android:max="100"
    android:progress="0"/>

Файл custom_progress_drawable.xml в res/drawable может выглядеть так:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dp" />
            <solid android:color="#D3D3D3" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dp" />
                <solid android:color="#FF6347" />
            </shape>
        </clip>
    </item>
</layer-list>

Файл custom_progress_drawable.xml в res/drawable может выглядеть так:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dp" />
            <solid android:color="#D3D3D3" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dp" />
                <solid android:color="#FF6347" />
            </shape>
        </clip>
    </item>
</layer-list>

Здесь создается слой для фона и слоя прогресса с закругленными углами и цветом.

Заключение

ProgressBar — это простой, но мощный инструмент для улучшения взаимодействия пользователя с приложением. Его правильное использование позволяет приложению быть более отзывчивым и понятным для пользователя. Используйте неопределенные индикаторы для задач с неопределённым временем выполнения и определённые индикаторы для тех задач, где можно отслеживать прогресс. Не забудьте правильно управлять фоновыми потоками, чтобы избежать блокировки интерфейса пользователя.