DatePickerDialog的确定和取消按钮

今天遇到一个时间弹出框的问题, 就是想用时间框的取消按钮清空文本显示的日期数据。

然而取消按钮每次都要调用OnDateSetListener.onDateSet方法,就会影响取消按钮完成的功能!

下面是我一步一步完成的过程,这样我觉得对大家的帮助也会很大(比直接给出)!

  1.先说说一个自定义的时间弹出框,点击TextView,就弹出时间框 

  2.添加确定、取消按钮  

  3.取消和确定按钮分别完成功能,和之间的问题

一、自定义时间的弹出框

  其实只是使用了jar包的DatePickerDialog(android.app.DatePickerDialog),在使用中,直接像TextView在布局文件中使用就可以了!

  创建一个类DatePickerInput继承TextView:

      (这里的确定和取消按钮都可以设置文本框的日期)

public class DatePickInput extends TextView {

	//构造方法
	public DatePickInput(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public DatePickInput(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public DatePickInput(Context context) {
		super(context);
	}

	@Override
	protected void onFinishInflate() {
		//是否处在编辑模式,不能进行编辑
		if (isInEditMode()) {
			return;
		}
		//设置不可聚焦,避免TextView的输入
		setFocusable(false);
		//时间格式
		final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
		//日历,获取日期
		final Calendar c = Calendar.getInstance();
		//DatePickInput的点击事件
		setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//时间
				Date date = new Date();
				try {
					//从文本获取日期
					date = dateFormat.parse(getText().toString());
				}
				catch (ParseException e) {
				}
				//将日历的时间修改为文本的显示日期
				c.setTime(date);
				//创建时间框,第一个参数是上下文,第二个参数是style,第三个参数是回调方法
				//后面三个参数是时间框弹出时显示的日期
				new DatePickerDialog(getContext(),com.example.test.R.style.dialog, new OnDateSetListener() {
					@Override
					public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
						//将日历日期改为我们设置的日期
						c.set(year, monthOfYear, dayOfMonth);
						//修改文本显示日期
						setText(dateFormat.format(c.getTime()));
					}
				}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH))
					.show();
			}
		});
	}
}

二、添加确定和取消按钮

        在上面的程序当中有确定和取消按钮,而且可以通过点击事件触发OnDateListener.onDateSet方法修改文本框的日期显示!

        但是,我想要使用确定和取消按钮分别完成一个功能,这样就不能区分了(确定和取消都要调用OnDateListener.onDateSet方法)!

        所以要自己分别添加这两个按钮,取消回调方法OnDateListener.onDateSet:

public class DatePickInput extends TextView {

	private DatePickerDialog mDialog;
	
	//构造方法
	public DatePickInput(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public DatePickInput(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public DatePickInput(Context context) {
		super(context);
	}

	@Override
	protected void onFinishInflate() {
		//是否处在编辑模式,不能进行编辑
		if (isInEditMode()) {
			return;
		}
		//设置不可聚焦,避免TextView的输入
		setFocusable(false);
		//时间格式
		final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
		//日历,获取日期
		final Calendar c = Calendar.getInstance();
		//DatePickInput的点击事件
		setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//时间
				Date date = new Date();
				try {
					//从文本获取日期
					date = dateFormat.parse(getText().toString());
				}
				catch (ParseException e) {
				}
				//将日历的时间修改为文本的显示日期
				c.setTime(date);
				//创建时间框,第一个参数是上下文,第二个参数是style,第三个参数是回调方法
				//后面三个参数是时间框弹出时显示的日期
				mDialog = new DatePickerDialog(getContext(),com.example.test.R.style.dialog,null,
						c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
				//添加时间框的确定按钮,其实setButton是AlertDialog中的方法,DatePickerDialog继承过来的
				mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						//将文本内容置为“1111”
						setText("1111");
					}
				});
				//添加时间框的取消按钮
				mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						//将文本内容置为空
						setText("");
					}
				});
				//时间框显示
				mDialog.show();
			}
		});
	}
}

三、取消清空文本、确定添加日期

         现在问题就是确定按钮怎么为文本框设置日期:

       (1)通过OnDateListener.onDateSet回调方法设置日期(确定和取消按钮点击就会触发该方法),就会使取消按钮失效(不采用)

       (2)通过确定按钮设置,就需要使用DatePickerDialog中的DatePicker来获取用户设置的时间:

public class DatePickInput extends TextView {

	private DatePickerDialog mDialog;
	
	//构造方法
	public DatePickInput(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public DatePickInput(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public DatePickInput(Context context) {
		super(context);
	}

	@Override
	protected void onFinishInflate() {
		//是否处在编辑模式,不能进行编辑
		if (isInEditMode()) {
			return;
		}
		//设置不可聚焦,避免TextView的输入
		setFocusable(false);
		//时间格式
		final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
		//日历,获取日期
		final Calendar c = Calendar.getInstance();
		//DatePickInput的点击事件
		setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//时间
				Date date = new Date();
				try {
					//从文本获取日期
					date = dateFormat.parse(getText().toString());
				}
				catch (ParseException e) {
				}
				//将日历的时间修改为文本的显示日期
				c.setTime(date);
				//创建时间框,第一个参数是上下文,第二个参数是style,第三个参数是回调方法
				//后面三个参数是时间框弹出时显示的日期
				mDialog = new DatePickerDialog(getContext(),com.example.test.R.style.dialog,null,
						c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
				//添加时间框的确定按钮,其实setButton是AlertDialog中的方法,DatePickerDialog继承过来的
				mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						//将文本内容置为时间框中选择的日期
		                //通过mDialog.getDatePicker()获得dialog上的DatePicker组件,然后可以获取日期信息  
		                DatePicker datePicker = mDialog.getDatePicker();  
		                int year = datePicker.getYear();  
		                int month = datePicker.getMonth();  
		                int day = datePicker.getDayOfMonth();  
		                c.set(year, month, day);
		                setText(dateFormat.format(c.getTime()));
					}
				});
				//添加时间框的取消按钮
				mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						//将文本内容置为空
						setText("");
					}
				});
				//时间框显示
				mDialog.show();
			}
		});
	}
}

      这样就完成了DatePickerDialog的确定设置文本的日期和取消按钮清空文本!

         

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值