前言:最近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也可以实现,但是毕竟现在已经不推荐使用这个控件了,谁知道什么时候就会取消呢。如果小伙伴有更好的方法可以实现弹出框进度条,可以留言。