欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中ProgressBar的使用-通过Handler与Message实现进度条显示

程序员文章站 2022-04-10 13:48:16
场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 实现 将布局改为相对布局,然后添加一个ProgressBar,并添加id属性。 然后通过 android:max=" ......

场景

进度条效果

Android中ProgressBar的使用-通过Handler与Message实现进度条显示

 

 


Android中ProgressBar的使用-通过Handler与Message实现进度条显示

注:

博客:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

将布局改为相对布局,然后添加一个progressbar,并添加id属性。

然后通过

 android:max="100"

 

设置进度条最大值

通过

android:layout_alignparentbottom="true"
android:layout_marginbottom="50dp"

 

设置其位置在底部并设置外边距

关于进度条的样式,参考如下

Android中ProgressBar的使用-通过Handler与Message实现进度条显示

 

 

这里使用的进度条样式是

style="?android:attr/progressbarstylehorizontal"

 

完整xml示例代码

<?xml version="1.0" encoding="utf-8"?>
<relativelayout 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"
    tools:context=".progressbaractivity">

    <progressbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressbarstylehorizontal"
        android:max="100"
        android:layout_alignparentbottom="true"
        android:layout_marginbottom="50dp"
        android:id="@+id/progressbar"

        />

</relativelayout>

 

然后来到activity

要实现进度条的简单流程如下

Android中ProgressBar的使用-通过Handler与Message实现进度条显示

 Android中ProgressBar的使用-通过Handler与Message实现进度条显示

 

 

首先在activity中声明进度条对象、进度值、handler对象。

关于hnadler对象,因为android不支持在主线程中更新ui控件,所以提供了handler对象。

首先通过id获取进度条对象,然后实例化handler,需要重写其handlemessage方法

Android中ProgressBar的使用-通过Handler与Message实现进度条显示

 

 

Android中ProgressBar的使用-通过Handler与Message实现进度条显示

在handlemessage方法中,通过msg的标识来判断是否完成进度条的加载。

然后需要新开一个线程,在线程中随机给进度条添加进度值,然后判断是否到100,进而报告不同的进度和标识变量。

完整示例代码

package com.badao.relativelayouttest;

import androidx.annotation.nonnull;
import androidx.appcompat.app.appcompatactivity;

import android.os.bundle;
import android.os.handler;
import android.os.message;
import android.view.view;
import android.widget.progressbar;
import android.widget.toast;

import java.util.prefs.preferencechangeevent;

public class progressbaractivity extends appcompatactivity {

    private progressbar progressbar;
    private int mprogress = 0;
    private  handler mhandler;
    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_progress_bar);

        //获取进度条控件
        progressbar = (progressbar) findviewbyid(r.id.progressbar);
        //android 不支持在主线程中更新ui组件 所以提供了handler对象
        mhandler = new handler(){
            //通过消息代码msg进行区分是否加载完成
            @override
            public void handlemessage(@nonnull message msg) {
                if(msg.what ==0x111)
                {
                    //给进度条赋值
                    progressbar.setprogress(mprogress);
                }else
                {
                    toast.maketext(progressbaractivity.this,"加载完成",toast.length_short).show();
                    progressbar.setvisibility(view.gone);
                }
            }
        };

        //新建一个线程
        new thread(new runnable() {
            @override
            public void run() {
                while (true)
                {
                    //具体执行的方法的进度,返回进度
                    mprogress = dowork();
                    //定义一个标识,标识进度条是否加载完成
                    message message = new message();
                    if(mprogress <100)
                    {
                        //表示还没加载到100  则向进度条报告进度
                        message.what = 0x111;
                        mhandler.sendmessage(message);
                    }else
                    {
                        //表示此时已经加载完成,向handler发送消息  并跳出循环
                        message.what =0x110;
                        mhandler.sendmessage(message);
                        break;
                    }
                }
            }
            //具体执行 并返回进度的方法
            private int dowork()
            {
                //进度条随机加进度
                mprogress +=math.random()*10;
                try {
                    //进程休眠0.5秒
                    thread.sleep(500);
                } catch (interruptedexception e) {
                    e.printstacktrace();
                }
                return mprogress;
            }
        }).start(); //启动进程
    }
}