现在的位置: 首页 > 综合 > 正文

android-UI组件实例大全(十五)——其他对话框:ProgressDialog,Date/TimePickerDialog

2015年11月17日 ⁄ 综合 ⁄ 共 4904字 ⁄ 字号 评论关闭

一.ProgressDialog:进度对话框

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

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

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

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


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

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

MainActivity.java:


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:


代码如下:

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

抱歉!评论已关闭.