相关文章推荐
好帅的领带  ·  评分 Rate - Ant Design·  3 月前    · 
傲视众生的领带  ·  SQL ...·  5 月前    · 
踢足球的洋葱  ·  pyqt5 ...·  10 月前    · 
淡定的菠萝  ·  元对象机制_百度百科·  1 年前    · 

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

然而取消按钮每次都要调用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的确定设置文本的日期和取消按钮清空文本! 今天遇到一个时间弹出框的问题, 就是想用时间框的取消按钮清空文本显示的日期数据。然而取消按钮每次都要调用OnDateSetListener.onDateSet方法,就会影响取消按钮完成的功能!下面是我一步一步完成的过程,这样我觉得对大家的帮助也会很大(比直接给出)!        1.先说说一个自定义的时间弹出框,点击TextView,就弹出时间框   2.添加确定、取
近日测试给提了个新的bug,他们要在选择时间的时候,点击清空按钮下拉框不收起 看了element文档,发现没有清空按钮这个方法,实际的操作效果一点击就时间选择框就收起了,日常来说也能用 ,但是用户体验不蛮好,本着从用户至上的角度出发,开始了到网上寻找解决办法, 思路是先获取清空按钮事件,这位大佬提供的方法比较简单实在: 点击清空按钮后监听到的value 是个 null 然后根据null做判断,代码如下,具体大家可以点链接去看,看这里 timeChange(value) { 这是因为Element-ui中没有内置清除按钮的回调函数, 当点击清除按钮的时候,value会被设置为null。 因此要解决这个bug,我使用的方法是在下次调用之前,为value重新赋值 if (!newData) { newData = [] 因为Element-ui中没有内置清除按钮的回调函数,所以clear事件不生效 我就在为value重新赋值时添加我要做的事: watch: { time_v
最近有人问到关于如何实现类似Windows系统中时间调整的控件啊(红色部分),比如: 一开始我抓耳挠腮想了老半天没有结果,后来在其他人提醒之下想到了DateTimePicker控件,并且做了调整——只要设置几个属性就可以了: 1)Format设置为Time。 2)ShowUpDown设置为True。 但是如果说要增加“日期+时间”的选择怎么办呢?比如实现以下效果: 要实现既可以选...
java.lang.IllegalStateException: you have not supplyed the global app context info from SDKInitializ 10285 java.lang.IllegalStateException: you have not supplyed the global app context info from SDKInitializ java.lang.IllegalStateException: you have not supplyed the global app context info from SDKInitializ Android真机获取root权限,进入data目录 qq_30392681: 6666666666666 Android开发环境搭建 包子代码: 写点好用的 ADT离线集成 包子代码: