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


    场景

    进度条效果


    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

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

    然后通过

     android:max="100"

    设置进度条最大值

    通过

    android:layout_alignParentBottom="true"
    android:layout_marginBottom="50dp"

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

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

    这里使用的进度条样式是

    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

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

     

    首先在Activity中声明进度条对象、进度值、Handler对象。

    关于Hnadler对象,因为Android不支持在主线程中更新UI控件,所以提供了Handler对象。

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

    在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(); //启动进程
        }
    }
    
     
  • 相关阅读:
    剑指offer03-04
    五大算法-1.回溯法
    linux与操作系统(1)- 用户接口
    python中的装饰器
    mysql 创建数据库,用户并给用户设置权限
    centOS6.5 桌面状态栏消失 解决
    centOS linux 远程Mysql 记录之root用户密码丢失
    XStream.toXML() 简单两种使用实例
    FileInputStream和FileOutStream 简单的使用实例;
    orale 行转列或者 字符拼接函数 wmsys.wm_concat()函数 /instr(listagg(name,';') within group (order by o.srclinkedid)
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12153933.html
Copyright © 2020-2023  润新知