13
2013-10

给TimePickerDialog添加取消按钮

TimePickerDialog有两个构造函数:

TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) 
TimePickerDialog(Context context, int theme, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView)

第一个参数(Acitivity.this)为弹出的时间对话框所在的activity指针;第二个参数是设置完时间后的回调函数,设置时间的主要工作都在里面的onTimeSet()里完成;第三个参数(hour)和第四个参数(minute)为弹出的时间对话框的初始显示的小时和分钟;第五个参数为设置24时显示参数,true代表时间以24时制显示时间。

至于int theme不知道怎么用,官网也言之不详。

最纠结的地方是TimePickerDialog的样式,网上几乎所有介绍TimePickerDialog使用方法的时候给出的样式都是这幅模样:

可是,实际上使用默认TimePickerDialog弹出的对话框样式却是这样:


只有一个按钮,也就意味着你不想设置时间了也没办法从屏幕上取消;从程序执行方面来说,就是打开对话框就要执行一次onTimeSet(),不能取消。这显然不合理。

想添加一个取消按钮怎么办,定义一个新的show():

    @Override  
     public void show() {  
         // TODO Auto-generated method stub  
        this.setButton( BUTTON_NEGATIVE , "Cancel",new OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    
                }
            });
         super.show();  
     }

进行到这一步,还没有完,不管你点取消按钮,还是点完成按钮,都会执行onTimeSet()。最可恶的是,点击Done按钮,onTimeSet()会执行两次,完全没有达到预期效果。据说这是android4.1和4.2的一个bug,在 onStop()时,会继续触发onTimeSet()。解决方法依然是覆盖:

 @Override
     protected void onStop() {
         //super.onStop();
     }

完整的类定义如下:

package com.awer;

import java.util.Calendar;

import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;

public class AwerTimePickerDialog extends TimePickerDialog {
     public AwerTimePickerDialog(Context context, OnTimeSetListener callBack,
             int hourOfDay, int minute, boolean is24HourView) {
         super(context, callBack,   hourOfDay,  minute,  is24HourView);
     }
     public AwerTimePickerDialog(Context context, OnTimeSetListener callBack, Calendar c ) {
         super(context, callBack, c.get(Calendar.HOUR_OF_DAY),  c.get(Calendar.MINUTE),  true);
     }
    
     @Override
     protected void onStop() {
         //super.onStop();
     }
    
    @Override  
     public void show() {  
         // TODO Auto-generated method stub  
        this.setButton( BUTTON_NEGATIVE , "取消",new OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    
                }
            });
         super.show();  
     }
    
}

在Activity里调用:

c=Calendar.getInstance();
new AwerTimePickerDialog(this,mTimeSetListener, c).show();


« 上一篇下一篇 »

留言列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。