Android自定义弹出计时进度条-ProgressDialog和ProgressBar的用法

2020-07-15 10:33:54 浏览数 (1)

前言:最近Android开发需要做一个弹出框进度条,经过几天的学习调研,现在在这里总结一下。

Android中一开始对进度条的实现是通过ProgressDialog,可以弹出一个对话框,对话框里显示进度条。但是ProgressDialog在8.0以后被遗弃了,虽然也可以用,但是官方不推荐使用。相应的替代品就是ProgressBar。ProgressBar是一个布局,只能写在xml文件中,而ProgressDialog可以在java代码中实现。 下面先来看一下ProgressDialog的用法,我一共设置了四种dialog,最后一种就是我需要的弹出框进度条,并且是计时进度条。

先看activity_main.xml,内容比较简单,就是设置了几个button,用来弹出相应的弹出框。

代码语言:javascript复制
<?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:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:onClick="putong"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="普通对话框"
        />
    <Button
        android:onClick="danxuan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="单选对话框"
        />
    <Button
        android:onClick="duoxuan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="多选对话框"
        />
    <Button
        android:onClick="jindutiao"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="进度条对话框"
        />

</LinearLayout>

下面看MainActivity中的代码:每个弹出框的布局都在相应的函数中实现,四个函数对应四个弹出框。进度条弹出框用的是ProgressDialog,如何计时用的系统时间,最下面写了一个StartTimer函数和EndTimer函数来进行计时操作,到达规定的时间则完成进度条,如果中途退出通过ProgressDialog的dismiss()来清除弹出框。

代码语言:javascript复制
package com.example.hello;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

    private int progress = 0;
    private Timer timer;
    private TimerTask timerTask;
    private ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void putong(View view) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("普通对话框");
        builder.setMessage("这是一个空白的对话框");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                System.out.println("点了确定");
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                System.out.println("点了取消");
            }
        });
        //调用show才能显示出来
        builder.show();

    }

    //点击按钮弹出一个单选对话框
    public void danxuan(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("请选择您喜欢的课程");
        final String items[] = {"web开发", "android开发", "web前段", "ios开发", "咸鱼"};
        //-1代表没有条目被选中
        builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //1.把选中的条目取出来
                String item = items[which];
                Toast.makeText(getApplicationContext(),item.toString(), Toast.LENGTH_LONG).show();
                //2.然后把对话框关闭
                dialog.dismiss();
            }
        });
        builder.show();
    }


    //多选对话框
    public void duoxuan(View view) {
        System.out.println("点击了");
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("你喜欢哪个明星");
        final String items[] = {"cxk", "赵丽颖", "“霸道总裁”黄晓明", "黄渤", "徐峥", "胡歌"};
        final boolean [] checkedItems ={true,false,false,false,false,true};
        builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            }
        });

        //把选中的挑选出来
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                StringBuffer sb = new StringBuffer();
                //把选中的条目的数据取出来
                for (int i = 0; i <checkedItems.length ; i  ) {
                    //判断下选中的
                    if(checkedItems[i]){
                        String fruit = items[i];
                        sb.append(fruit "");
                    }
                    Toast.makeText(getApplicationContext(),sb.toString(),Toast.LENGTH_LONG).show();
                    //2.然后把对话框关闭
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }

    //进度加载框
    public void jindutiao(View view) {
        dialog = new ProgressDialog(this);
        dialog.setTitle("请长按");
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

                dialog.setMax(10);
                dialog.setProgress(0);
                StartTimer();
                dialog.dismiss();

        dialog.show();
    }

    //activity启动后开始计时
    @Override
    protected void onResume() {
        super.onResume();
        //StartTimer();
    }

    //进入后台后计时器暂停
    @Override
    protected void onPause() {
        super.onPause();
        //EndTimer();
    }

    public void StartTimer() {
        //如果timer和timerTask已经被置null了
        if (timer == null&&timerTask==null) {
            //新建timer和timerTask
            timer = new Timer();
            timerTask = new TimerTask() {
                @Override
                public void run() {
                    //每次progress加一
                    progress  ;
                    //如果进度条满了的话就再置0,实现循环
                    if (progress == 11) {
                        dialog.dismiss();
                    }
                    //设置进度条进度
                    dialog.setProgress(progress);
                }
            };
            timer.schedule(timerTask, 1000, 1000);
        }
    }

    public void EndTimer()
    {
        timer.cancel();
        timerTask.cancel();
        timer=null;
        timerTask=null;
    }
}

下面看一下ProgressBar的效果,可以看到他是在系统界面展示一个进度条,并不能以弹出对话框的形式来实现进度条的功能。

这里是ProgressBar的相关代码,就是在xml文件中加了一个ProgressBar的布局,然后在MainActivity中进行展示出来。

代码语言:javascript复制
<ProgressBar
        android:id="@ id/progress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        />
    <TextView
        android:id="@ id/tvProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

MainActivity中的相关代码:

代码语言:javascript复制
  public void putongjindutiao(View view) {
        final ProgressBar  bar= (ProgressBar) findViewById(R.id.progress);
        final TextView textView= (TextView) findViewById(R.id.tvProgress);
        new Thread(){
            @Override
            public void run() {
                int i=0;
                while(i<100){
                    i  ;
                    try {
                        Thread.sleep(80);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    final int j=i;
                    bar.setProgress(i);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText(j "%");
                        }
                    });
                }
            }
        }.start();

    }

好了,到这里弹出框已经讲完了,其实结果还是不那么令人满意,我原本是计划通过ProgressBar来实现弹出框进度条的,但是最后发现实现不了,虽然ProgressDialog也可以实现,但是毕竟现在已经不推荐使用这个控件了,谁知道什么时候就会取消呢。如果小伙伴有更好的方法可以实现弹出框进度条,可以留言。

0 人点赞