博客地址:http://blog.csdn.net/u012637501/article/details/46003413
一、使用PopupWindow创建对话框风格的窗口
使用PopupWindow创建对话框风格的窗口步骤如下:
>调用PopupWindow的构造器创建PopupWindow对象;
>调用PopupWindow的showAsDropDown(View v)将PopupWindow作为v组件的下拉组件显示出来;或调用PopupWindow的showAtLocation()方法将PopupWindow在指定位置显示出来。
>调用PopupWindow的dismiss()方法取消显示popup窗口;
(1)对话框样式
(2)代码实现
- View view = getLayoutInflater().inflate(R.layout.dialog, null); //装载R.layout.popup对应的界面布局
- final PopupWindow popup = new PopupWindow(view, 500, 300); //指定布局资源,窗口高度、长度
- // popup.showAsDropDown(view); //以下拉方式显示
- popup.showAtLocation(findViewById(R.id.dialogBtn), Gravity.CENTER, 100, 100);
- popup.dismiss();
注:R.layout.dialog.xml只包含一个ImageVIew和Button组件
二、使用DatePickDialog、TimePickerDialog对话框
使用DataPickDialog、TimePickerDialog创建日期时间对话框,主要步骤如下:
>通过new关键字创建DatePickerDialog、TimePickerDialog实例,调用它们的show()方法显示日期选择对话框和时间选择对话框;
>为DatePickerDialog、TimePickerDialog绑定监听器,通过设置事件触发监听器,获取用户设置的事件
其中
DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)
TimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView)
1.对话框样式
2.代码实现
- Calendar calendar = Calendar.getInstance();
- new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
- public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {
- Toast.makeText(MainActivity.this, "你选择的日期为:"+year+":"+monthOfYear+":"
- +dayOfMonth, Toast.LENGTH_SHORT).show();
- }
- }
- //初始化日期
- , calendar.get(Calendar.YEAR)
- , calendar.get(Calendar.MONTH)
- , calendar.get(Calendar.DAY_OF_MONTH)).show();
- /************************************************************************/
- Calendar calendar = Calendar.getInstance();
- new TimePickerDialog(MainActivity.this, new OnTimeSetListener() {
- public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
- Toast.makeText(MainActivity.this, "你选择的时间为:"+hourOfDay+":"+minute, Toast.LENGTH_SHORT).show();
- }
- }
- //初始化时间
- , calendar.get(Calendar.HOUR_OF_DAY)
- , calendar.get(Calendar.MINUTE),
- //true表示采用24小时制
- true).show();
使用ProgressDialog创建进度对话框主要有两种方式:
>如果只是创建简单的进度对话框,调用ProgressDialog提供的静态show()方法显示对话框即可;
ProgressDialog progressDialog = ProgressDialog.show( LoginActivity.this, "", "正在登录,请稍后.....");
progressDialog.dismiss(); //取消进度条对话框
>创建ProgeressDialog,然后调用方法对话框里的进度条进行设置,设置完成后将对话框显示处理,ProgressDialog包含以下常用方法:
setIndeteminate(boolean indeteminate):设置对话框里的进度条不显示进度值;
setMax(int max):设置对话框里进度条的最大值;
setMax(int max):设置对话框里进度条的最大值;
setMessage(CharSequence message):设置对话框里显示的消息
setProgress(int value):设置对话框里进度条的进度值
setProgressStyle(int style):设置对话框里进度条的风格
1.对话框样式
2.代码实现
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //进度条
- ProgressDialog progressDialog = null;
- final static int MAX_PROGRESS = 100;
- private int[] data = new int[60];
- int progressStatus = 0;
- int hasData = 0;
- }
- /**
- * 定义一个负责更新进度条的Handler
- * */
- Handler handler = new Handler(){
- public void handleMessage(Message msg) {
- if(msg.what == 0x110){
- progressDialog.setProgress(progressStatus);
- }
- };
- };
- public void dialogBtn(View v){
- /**
- * 创建一个进度条对话框
- * */
- progressDialog = new ProgressDialog(this); //实例化一个ProgressDialog对象
- progressDialog.setTitle("任务进行中");
- progressDialog.setMessage("任务正在执行中,请稍后");
- progressDialog.setCancelable(false); //设置对话框能够触屏关闭
- progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); //设置对话框的进度条风格
- progressDialog.setIndeterminate(false); //设置对话框的进度条是否显示进度
- progressDialog.show(); //显示对话框
- /**
- * 创建一个子线程,定时发送消息给Handler
- * */
- new Thread(new Runnable(){
- public void run() {
- while(progressStatus < MAX_PROGRESS){
- progressStatus = MAX_PROGRESS*doWork()/data.length; //获取耗时操作的完成百分比
- handler.sendEmptyMessage(0x110);
- }
- if(progressStatus >= MAX_PROGRESS){ //任务完成,退出对话框
- progressDialog.dismiss();
- }
- }
- }).start();
- }
- /**
- * 模拟一个耗时的操作
- * */
- protected int doWork() {
- data[hasData++] = (int)(Math.random()*100);
- try{
- Thread.sleep(500); //0.5s更新一次
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- return hasData;
- }
- }
注意:int[] data = new int[60];是因为当数组大小为50时,在耗时操作模块累加出现数组下标越界错误。
java.lang.ArrayIndexOutOfBoundsException: length=50; index=50