使用 Kotlin 的 Android 进度条

2023-11-10

在本教程中,我们将使用 Kotlin 在 Android 应用程序中讨论和实现 ProgressBar。

什么是进度条?

ProgressBar UI 元素用于在应用程序屏幕上显示进度。我们可以使用 ProgressBar 在应用程序屏幕上显示下载/上传进度。

进度条类型

进度条有两种类型。

  1. 确定进度条- 当您可以跟踪和显示完成的进度时使用此功能。
  2. 不确定的进度条- 这个会无限循环直到停止。

ProgressDialog 将在警报对话框中包含一个 ProgressBar。 ProgressDialog 现已弃用,因为在阻塞屏幕的同时在对话框中显示较长的进度并不是一个好主意。

进度条属性

ProgressBar 的一些重要属性是:

  • android:indeterminate- 用于指定表示ProgressBar类型的布尔值
  • android:max- 进度上限
  • android:min- 进度下限
  • android:progress- 进度增加的步骤。
  • android:minWidth and minHeight- 用于定义进度条的尺寸
  • android:progressBarTint- ProgressBar 完成进度的色调颜色
  • android:progressBarBackgroundTint- ProgressBar 完成进度的色调颜色
  • style- 用于设置ProgressBar的样式。默认情况下它是圆形的。我们可以将样式设置为@style/Widget.AppCompat.ProgressBar.Horizontal对于水平进度条
  • android:progressDrawable- 用于设置进度的可绘制对象。
  • android:secondaryProgress- 表示次要进度值。当我们想要显示子下载/子任务进度时使用此功能。

默认色调颜色设置为colorAccent定义在styles.xml.

进度条 XML 布局

基本的循环不确定 ProgressBar XML 布局如下所示:

<ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="50dp"
        android:minWidth="50dp" />

在下一节中,我们将使用 Kotlin 在 Android 应用程序中实现各种类型的 ProgressBar。

Android ProgressBar Kotlin 应用程序项目结构

android progressbar kotlin project structure

1.XML布局代码

Activity_main.xml布局的代码如下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="50dp"
        android:minWidth="50dp" />


    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:minHeight="50dp"
        android:minWidth="200dp" />


    <TextView
        android:id="@+id/textViewHorizontalProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0" />


    <ProgressBar
        android:id="@+id/progressBarHorizontal"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="false"
        android:max="100"
        android:minHeight="50dp"
        android:minWidth="200dp"
        android:progress="1"
        android:progressBackgroundTint="@android:color/darker_gray"
        android:progressTint="@color/colorPrimary" />


    <Button
        android:id="@+id/btnProgressBarHorizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="horizontalDeterminate"
        android:text="DETERMINATE HORIZONTAL PROGRESS BAR" />


    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ProgressBar
            android:id="@+id/progressBarSecondary"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:minHeight="150dp"
            android:padding="8dp"
            android:minWidth="150dp"
            android:progressDrawable="@drawable/progress_states" />

        <TextView
            android:id="@+id/textViewPrimary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:textColor="#000" />

        <TextView
            android:id="@+id/textViewSecondary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="25dp"
            android:layout_below="@+id/progressBarSecondary"
            android:textColor="@color/colorPrimaryDark" />


    </RelativeLayout>

    <Button
        android:id="@+id/btnProgressBarSecondary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="DETERMINATE SECONDARY PROGRESS BAR" />


</LinearLayout>

在最后一个进度条中,我们在水平进度条上设置了可绘制的进度。 drawable.xml 文件是progress_states.xml.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape android:shape="oval">
            <stroke
                android:width="4dp"
                android:color="@color/colorPrimary" />
            <solid android:color="@android:color/white" />
        </shape>
    </item>
    <item android:id="@android:id/secondaryProgress">
        <clip
            android:clipOrientation="vertical"
            android:gravity="bottom">
            <shape android:shape="oval">
                <stroke
                    android:width="4dp"
                    android:color="@android:color/black" />
                <solid android:color="@android:color/white" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip
            android:clipOrientation="vertical"
            android:gravity="bottom">
            <shape android:shape="oval">
                <stroke
                    android:width="4dp"
                    android:color="@color/colorAccent" />
                <solid android:color="#F288F8" />
            </shape>
        </clip>
    </item>
</layer-list>

在此可绘制对象中,我们创建了可绘制对象的不同状态。所有都是圆形的,每一层都会显示不同的状态——空闲、次要进度、主要进度。

2.Kotlin主要活动代码

让我们看一下 MainActivity.kt Kotlin 类代码。

package net.androidly.androidlyprogressbar

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {


    var isStarted = false
    var progressStatus = 0
    var handler: Handler? = null
    var secondaryHandler: Handler? = Handler()
    var primaryProgressStatus = 0
    var secondaryProgressStatus = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        handler = Handler(Handler.Callback {
            if (isStarted) {
                progressStatus++
            }
            progressBarHorizontal.progress = progressStatus
            textViewHorizontalProgress.text = "${progressStatus}/${progressBarHorizontal.max}"
            handler?.sendEmptyMessageDelayed(0, 100)

            true
        })

        handler?.sendEmptyMessage(0)


        btnProgressBarSecondary.setOnClickListener {
            primaryProgressStatus = 0
            secondaryProgressStatus = 0

            Thread(Runnable {
                while (primaryProgressStatus < 100) {
                    primaryProgressStatus += 1

                    try {
                        Thread.sleep(1000)
                    } catch (e: InterruptedException) {
                        e.printStackTrace()
                    }

                    startSecondaryProgress()
                    secondaryProgressStatus = 0

                    secondaryHandler?.post {
                        progressBarSecondary.progress = primaryProgressStatus
                        textViewPrimary.text = "Complete $primaryProgressStatus% of 100"

                        if (primaryProgressStatus == 100) {
                            textViewPrimary.text = "All tasks completed"
                        }
                    }
                }
            }).start()
        }

    }

    fun startSecondaryProgress() {
        Thread(Runnable {
            while (secondaryProgressStatus < 100) {
                secondaryProgressStatus += 1

                try {
                    Thread.sleep(10)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }

                secondaryHandler?.post {
                    progressBarSecondary.setSecondaryProgress(secondaryProgressStatus)
                    textViewSecondary.setText("Current task progress\n$secondaryProgressStatus% of 100")

                    if (secondaryProgressStatus == 100) {
                        textViewSecondary.setText("Single task complete.")
                    }
                }
            }
        }).start()
    }

    fun horizontalDeterminate(view: View) {
        isStarted = !isStarted
    }

}

The horizontalDeterminate Kotlin function is triggered when the first button is clicked. It is used to start/stop Horizontal ProgressBar. A Handler is associated with a single thread. It is used to send messages to the Thread. The btnProgressBarSecondary click triggers the second progress bar. We have created two handlers - one for the normal progress and second for the subtasks. In each of them, we are setting the thread to sleep. For the secondary thread, the sleep time is 1/100 of the primary progress thread. The progress value is displayed on the TextView. Output: android progress bar kotlin app output

您可以从以下链接下载该项目:Androidly进度条

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Kotlin 的 Android 进度条 的相关文章

随机推荐

  • 如何在 Ubuntu 20.04 上安装 Apache

    Apache 是世界上最流行的 Web 服务器之一 它是一个开源 跨平台的 HTTP 服务器 为大部分互联网网站提供支持 Apache 提供了许多强大的功能 可以通过附加模块进行扩展 本教程介绍如何在 Ubuntu 20 04 上安装和管理
  • 如何在 Debian 9 上设置 SSH 密钥

    Secure Shell SSH 是一种加密网络协议 用于客户端和服务器之间的安全连接 支持各种身份验证机制 两种最流行的机制是基于密码和基于公钥的身份验证 使用 SSH 密钥比传统的密码身份验证更安全 更方便 在本教程中 我们将描述如何在
  • 什么是 503 服务不可用错误

    浏览网页时最常见的错误之一是 503 服务不可用错误 此消息表明网络服务器遇到技术问题 无法处理请求 本文解释了 503 错误的含义 为什么会收到 HTTP 503 代码以及如何解决这些错误 什么是 HTTP 503 错误 当您打开网页时
  • 如何使用 SSHFS 通过 SSH 挂载远程目录

    SSHFS SSH 文件系统 是基于 FUSE 的文件系统客户端 用于通过 SSH 连接挂载远程目录 SSHFS 使用 SFTP 协议 它是 SSH 的一个子系统 并且在大多数 SSH 服务器上默认启用 与其他网络文件系统协议 例如 NFS
  • Linux 中的 pidof 命令

    pidof是一个命令行实用程序 可让您查找正在运行的程序的进程 ID 在这篇文章中 我们将解释如何使用Linuxpidof命令 如何使用pidof命令 有不同的实现pidof适用于基于 Red Hat 和 Debian 的发行版 在 Red
  • 在 Ubuntu 20.04 上安装 ONLYOFFICE 文档

    ONLYOFFICE Docs 是一个根据 AGPLv3 许可证分发的开源办公套件 它允许处理办公文档 电子表格和演示文稿 以及可填写的表格 您可以将其另存为 PDF 文件 该套件使用 DOCX XLSX 和 PPTX 作为核心格式 保证与
  • 如何在 CentOS 8 上安装 VirtualBox 来宾添加

    虚拟盒子是开源的跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 VirtualBox 提供了一组驱动程序和应用程序 VirtualBox Guest Additions 可以安装在来宾操作系统中以扩展来宾操作系统的功能 例如共享文
  • 如何在Linux中检查监听端口(正在使用的端口)

    在对网络连接或特定于应用程序的问题进行故障排除时 首先要检查的事情之一应该是系统上实际使用的端口以及哪个应用程序正在侦听特定端口 本文介绍了如何使用netstat ss and lsof命令来找出哪些服务正在侦听哪些端口 这些说明适用于所有
  • 如何在 CentOS 7 上安装 Nginx

    Nginx 发音engine x是一个免费 开源 高性能的 HTTP 和反向代理服务器 负责处理 Internet 上一些最大网站的负载 Nginx 可以用作独立的 Web 服务器 也可以用作反向代理 for Apache和其他网络服务器
  • 如何在 Debian 10 上安装 Anaconda

    Anaconda 是最流行的 Python R 数据科学和机器学习平台 它用于大规模数据处理 预测分析和科学计算 Anaconda 发行版附带 1 500 多个开源数据包 它还包括 conda 命令行工具和名为 Anaconda Navig
  • 如何在 Linux 中更改用户密码

    在本指南中 我们将解释如何在 Linux 中更改用户密码 我们还将向您展示如何强制用户在下次登录时更改密码 这些说明适用于任何 Linux 发行版 包括 Ubuntu Debian 和 CentOS 介绍 在 Linux 中 您可以使用以下
  • 如何在 Ubuntu 18.04 上安装 Elasticsearch

    Elasticsearch 是一个开源分布式全文搜索和分析引擎 它支持 RESTful 操作 允许您实时存储 搜索和分析大量数据 Elasticsearch 是最流行的搜索引擎之一 为具有复杂搜索要求的应用程序 例如大型电子商务商店和分析应
  • 如何在 CentOS 8 上更改主机名

    通常 主机名是在操作系统安装期间设置的 或者在创建虚拟机时动态分配给虚拟机的 您可能需要更改主机名的原因有很多 最常见的是在创建实例时自动设置主机名 本指南介绍了如何在 CentOS 8 上设置或更改主机名 而无需重新启动系统 先决条件 在
  • 如何在 Debian 9 上安装 VLC 媒体播放器

    VLC 是一个免费的开源多媒体播放器 它是跨平台的 可以播放几乎所有多媒体文件以及 DVD 音频 CD 和不同的流媒体协议 本教程介绍如何在 Debian 9 上安装 VLC 媒体播放器 先决条件 您需要以以下身份登录具有 sudo 访问权
  • 如何在 CentOS 8 上安装和配置 Fail2ban

    所有暴露在互联网上的服务器都面临着恶意软件攻击的风险 例如 如果您有一个连接到公共网络的软件 攻击者可以使用暴力尝试来获取对该应用程序的访问权限 Fail2ban 是一款开源工具 可通过监控服务日志中的恶意活动来帮助保护您的 Linux 计
  • 如何在 Debian 10 Linux 上安装 Apache Cassandra

    Apache Cassandra 是一个免费的开源 NoSQL 数据库 不存在单点故障 它提供线性可扩展性和高可用性 而不会影响性能 许多拥有大型活跃数据集的公司都在使用 Apache Cassandra 包括 Reddit NetFlix
  • 如何在 CentOS 8 上安装 Gitea

    Gitea 是一个用 Go 编写的自托管开源 git 服务器 它配备了存储库文件编辑器 项目问题跟踪 用户管理 通知 内置 wiki 等等 Gitea是一个轻量级应用程序 可以安装在功能较弱的系统上 如果您正在寻找内存占用小得多的 Gitl
  • 如何在Ubuntu 20.04服务器上安装Python 3并设置编程环境

    介绍 对于初学者和经验丰富的开发人员来说 Python 编程语言越来越受欢迎 Python 灵活且用途广泛 在脚本编写 自动化 数据分析 机器学习和后端开发方面具有优势 首次发布于 1991 年 其名称的灵感来自英国喜剧团体 Monty P
  • 如何在 Ubuntu 12.04 上添加交换

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 使用 Kotlin 的 Android 进度条

    在本教程中 我们将使用 Kotlin 在 Android 应用程序中讨论和实现 ProgressBar 什么是进度条 ProgressBar UI 元素用于在应用程序屏幕上显示进度 我们可以使用 ProgressBar 在应用程序屏幕上显示