Когда приложение загружает данные из интернета или выполняет сложную задачу, пользователь не должен гадать, работает ли программа или зависла. Для этого используются индикаторы загрузки — полоски и крутящиеся колёса, которые показывают, что процесс продолжается. Сегодня в Android Studio мы создадим небольшое приложение с прогресс-баром на языке Kotlin. Этот урок предоставит вам готовый шаблон, который можно легко внедрить в любой проект.
Два вида ProgressBar
В Android есть два основных типа индикаторов. Первый — круговой (спиннер), который просто крутится, не показывая процент выполнения. Второй — горизонтальный, который заполняется слева направо по мере завершения задачи. Выбор зависит от сценария: если точное время ожидания неизвестно, лучше использовать спиннер. Если известно — горизонтальную полоску.
Добавляем ProgressBar в разметку
Откройте activity_main.xml в режиме Design. В палитре найдите ProgressBar и перетащите его на экран. По умолчанию это круговой индикатор. Рядом разместите кнопку с текстом «Загрузить» и текстовую метку для статуса. Кнопке задайте id loadButton, метке — statusText, прогресс-бару — progressBar.
Чтобы получить горизонтальный индикатор, добавьте в XML-коде стиль:
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100" />
Атрибут android:max задаёт максимальное значение прогресса. Для процентов удобно использовать 100, чтобы сразу получать готовый процент.
Меняем прогресс из кода
В MainActivity.kt найдём элементы по id и пропишем логику. При нажатии на кнопку запустим имитацию загрузки: будем увеличивать прогресс от 0 до 100 с небольшой задержкой. Для этого используем корутину, которая каждые 100 миллисекунд обновляет значение.
val progressBar = findViewById<ProgressBar>(R.id.progressBar)
val statusText = findViewById<TextView>(R.id.statusText)
val loadButton = findViewById<Button>(R.id.loadButton)
loadButton.setOnClickListener {
loadButton.isEnabled = false
lifecycleScope.launch {
for (i in 0..100) {
progressBar.progress = i
statusText.text = "Загружено $i%"
delay(100)
}
statusText.text = "Готово!"
loadButton.isEnabled = true
}
}
Кнопка блокируется на время загрузки, чтобы пользователь не запустил несколько операций одновременно. Корутина позволяет обновлять интерфейс плавно, без зависаний.
Как показать и спрятать индикатор
После завершения загрузки горизонтальный прогресс-бар можно скрыть. Для этого меняем свойство visibility на View.GONE. В начале загрузки, наоборот, показываем его снова.
progressBar.visibility = View.GONE // скрыть
progressBar.visibility = View.VISIBLE // показать
Это делает интерфейс чище: когда загрузки нет, индикатор не занимает место на экране.
Круговой индикатор и неопределённый прогресс
Если вы оставили стандартный круговой ProgressBar, ему не нужны значения — он крутится сам. Для остановки достаточно скрыть его. Такой индикатор хорош для сетевых запросов, когда неизвестно, сколько времени займёт ответ сервера.
// перед запросом
progressBar.visibility = View.VISIBLE
// после получения ответа
progressBar.visibility = View.GONE
Несколько простых рекомендаций
- Всегда показывайте индикатор при длительных операциях. Если приложение «задумалось» без обратной связи, пользователь закроет его через пару секунд.
- Блокируйте повторные действия. Отключайте кнопку на время загрузки, чтобы избежать дублирования запросов.
- Используйте корутины. Обновление прогресса должно происходить асинхронно, иначе интерфейс зависнет.
Чему мы научились
Сегодняшний практический урок в среде Android Studio на языке Kotlin показал, как добавить в приложение индикатор загрузки. Вы научились создавать горизонтальный и круговой ProgressBar, управлять их видимостью и обновлять прогресс в корутине. Теперь любая длительная операция в вашем приложении будет выглядеть профессионально, а пользователь всегда будет знать, что программа работает. Попробуйте добавить прогресс-бар при загрузке данных из сети — это естественный следующий шаг.