对话框:ProgressDialog,Date/TimePickerDialog

一.ProgressDialog:进度对话框

就是一个带有进度条的对话框

有两种创建进度条对话框的方式:

1.直接调用ProgressDialog提供的静态方法show()显示即可

2.创建ProgressDialog,再设置对话框的参数,最后show()出来即可

代码这里分别定义了一个圆形,不带进度显示的条形,带加载的进度条三种进度条提示框

布局文件中只是定义了三个Button,比较简单,这里就不给出了

MainActivity.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
public class MainActivity extends Activity {  

private Button btnone;
private Button btntwo;
private Button btnthree;
private ProgressDialog pd1 = null;
private ProgressDialog pd2 = null;
private final static int MAXVALUE = 100;
private int progressStart = 0;
private int add = 0;

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

btnone = (Button) findViewById(R.id.btnone);
btntwo = (Button) findViewById(R.id.btntwo);
btnthree = (Button) findViewById(R.id.btnthree);

//定义一个用于更新进度的Handler,因为只能由主线程更新界面,所以要用Handler传递信息
final Handler hand = new Handler()
{
@Override
public void handleMessage(Message msg) {
//这里的话如果接受到信息码是123
if(msg.what == 123)
{
//设置进度条的当前值
pd2.setProgress(progressStart);
}
//如果当前大于或等于进度条的最大值,调用dismiss()方法关闭对话框
if(progressStart >= MAXVALUE)
{
pd2.dismiss();
}
}
};


//1.这个一个普通的圆形的进度条,直接调用静态方法show()
btnone.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//这里的话参数依次为,上下文别写getApplicationContext会报错的哦,标题,内容,是否显示进度,是否可以用取消按钮关闭
ProgressDialog.show(MainActivity.this, "资源加载中", "资源加载中,请稍后...",false,true);
}
});
//2.定义一个条形的进度条,但是不带动态更新的
btntwo.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
pd1 = new ProgressDialog(MainActivity.this);
//依次设置标题,内容,是否用取消按钮关闭,是否显示进度
pd1.setTitle("软件更新中");
pd1.setMessage("软件正在更新中,请稍后...");
pd1.setCancelable(true);
//这里是设置进度条的风格,HORIZONTAL是水平进度条,SPINNER是圆形进度条
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd1.setIndeterminate(true);
//调用show()方法将ProgressDialog显示出来
pd1.show();

}
});
//3.定义一个带进度更新的条形进度条
btnthree.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//初始化属性
progressStart = 0;
add = 0;
//依次设置一些属性
pd2 = new ProgressDialog(MainActivity.this);
pd2.setMax(MAXVALUE);
pd2.setTitle("文件读取中");
pd2.setMessage("文件加载中,请稍后...");
//这里设置为不可以通过按取消按钮关闭进度条
pd2.setCancelable(false);
pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//这里设置的是是否显示进度,设为false才是显示的哦!
pd2.setIndeterminate(false);
pd2.show();
//这里的话新建一个线程,重写run()方法,
new Thread()
{
public void run()
{
while(progressStart < MAXVALUE)
{
//这里的算法是决定进度条变化的,可以按需要写
progressStart = 2 * usetime() ;
//把信息码发送给handle让更新界面
hand.sendEmptyMessage(123);
}
}
}.start();
}

//这里设置一个耗时的方法:
private int usetime() {
add++;
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
}
return add;
};
});
}

}

运行截图:



代码解释:

1.调用静态方法显示的环形进度条:show()方法的参数依次为:当前的Activity.this;标题;提示内容;是否显示进度;是否可以按”回退”键关闭

2.另一种的流程是:
①new ProgressDialog(当前Activity.this);
②设置标题:setTitle()
③设置内容:setMessage()
④设置是否可通过回退按钮关闭:setCancelable()
⑤设置进度条是否显示进度,设置为true的话就会变成第p3中不会动的进度条,setIndeterminate()
⑥设置进度条的类型:两种STYLE_HORIZONTAL水平进度条 STYLE_SPINNER圆形进度条
⑦设置进度条的进度值:setProgress()

3.简单解释下这里为什么要用到handle类,因为这涉及到了线程安全的问题,界面的更新只能够在主线程中进行,

不能够在子线程中进行界面的更新,不然会报错,处理方法就是通过handle类,发送带有信息码的空信息给handle,

判断信息码后进行界面的更新,这里的话就是更新我们进度条的当前值

源码下载:

http://pan.baidu.com/s/1BZT8I

二.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框

这里的话先要说明一点啊

这个Date/TimePickerDialog只是供用户来选择日期时间,对于android系统的系统时间,日期没有任何影响,google暂时没有公布系统日期时间设置的API,

如果要在app中设置的话,要重新编译android的系统源码.灰常麻烦哦!

这两个灰常相似,这里的话就把他们写在一个程序中,两个构造方法:

DatePickerDialog(当前视图.this;DatePickerDialog.OnDateSetListener()监听器;年;月;日)

TimePickerDialog(当前视图.this;TimePickerDialog.OnTimeSetListener()监听器;小时,分钟,是否采用24小时制)

布局文件:只有两个普通按钮,略过

MainActivity.java:

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class MainActivity extends Activity {  

private Button btndate;
private Button btntime;
private String result = "";

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

btndate = (Button) findViewById(R.id.btndate);
btntime = (Button) findViewById(R.id.btntime);

btndate.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//这句话是获得当前的系统时间
Calendar cale = Calendar.getInstance();
/*这里的话因为比较麻烦,所有就直接new一个DatePickerDialog对象,构造方法中的参数依次为:
上下文,OnDateSetListener的监听器,整形的年,月,日
*/
new DatePickerDialog(MainActivity.this,new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
result += "你选择的是"+year+"年"+monthOfYear+"月"+dayOfMonth+"日";
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
}
}
,cale.get(Calendar.YEAR)
,cale.get(Calendar.MONTH)
,cale.get(Calendar.DAY_OF_MONTH)).show();
}
});

btntime.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Calendar cale = Calendar.getInstance();
new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
result = "";
result += "您选择的时间是:"+hourOfDay+"时"+minute+"分";
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
}
}, cale.get(Calendar.HOUR_OF_DAY), cale.get(Calendar.MINUTE), true).show();
}
});

}
}

运行截图:





代码解释:

  1. Calendar c = Calendar.getInstance()获取当前的系统时间

  2. Calendar.YEAR / MONTH / DAY_OF_MONTH / HOUR_OF_DAY / MINUTE 依次为:年,月,日,时,分

源码下载:

http://pan.baidu.com/s/1ziFFk