android DatePickerDialog TimePickerDialog set方法执行的不规律解决以及 DatePicker TimePicker的使用

在我们的实际开发过程中,可能会遇到需要点击个按钮弹出一个对话框让我们选择时间什么的,这个时候我们肯定会首先想到DatePickDialog和TimePickerDialog这两个对话框

可是在使用的过程中,我们发现这两个对话框并没有我们想象 的那么得心应手,例如我们点击按钮,弹出来一个DatePickerDialog,这个dialog里面有一个dateset的建通方法,当我们点击确定的时候,这个方法会执行,当我们点击屏幕的其他的地方的时候,这个方法也会执行,甚至当我们点击back按键的时候,这个方法也会执行,这就有点让人不理解了...

当然了,针对这个,我们还是有处理方法的:

datePickerDialog.setCanceledOnTouchOutside(false);

这样的话,我们弹出对话框后,不可以通过back键来返回上一个activity,只能通过点击dialog上面的完成按钮才能返回去,虽然目的完成了,但是体验性并不好,如果有特殊需求的话也是可以使用这个方法的

下面说下这次的主要内容,就是,我们通过在xml布局文件中,定义一个DatePicker和TimePick的布局文件,然后在我们的相应的代码中,使用dialog加载这两个布局

然后我们给dialog设置上两个按钮就可以了...

具体的代码如下:

DatePicker的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请选择日期:" />

    <DatePicker
        android:id="@+id/dp_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

</LinearLayout>
TimePicker的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请选择时间:" />

    <TimePicker
        android:id="@+id/tp_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

</LinearLayout>


主activity的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="date" />

    <Button
        android:id="@+id/btn_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="time" />

</LinearLayout>


主activity的代码:

package com.example.testdatepickerdialog;

import java.util.Calendar;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
import android.widget.Toast;

public class Main extends Activity {

	private Button date, time;
	private LayoutInflater layoutinflater;
	private DatePicker datePicker;
	private TimePicker timePicker;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		initView();
	}

	private void initView() {
		layoutinflater = LayoutInflater.from(Main.this);
		MyClick click = new MyClick();
		// TODO Auto-generated method stub
		date = (Button) findViewById(R.id.btn_date);
		time = (Button) findViewById(R.id.btn_time);
		date.setOnClickListener(click);
		time.setOnClickListener(click);

	}

	public class MyClick implements OnClickListener {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.btn_date:
				dialogShowDate(R.layout.test_date_dialog);
				break;
			case R.id.btn_time:
				dialogShowTime(R.layout.test_time_dialog);
				break;
			default:
				break;
			}
		}

	}

	@SuppressLint("NewApi")
	public void dialogShowDate(int layoutres) {
		MyDateChangeListener dateChangeListener = new MyDateChangeListener();
		AlertDialog.Builder builder = new Builder(Main.this);
		builder.setTitle("设置日期信息");
		View view = layoutinflater.inflate(layoutres, null);
		datePicker = (DatePicker) view.findViewById(R.id.dp_date);
		// 不让他显示日历详情
		datePicker.setCalendarViewShown(false);

		Calendar calendar = Calendar.getInstance();
		datePicker.init(calendar.get(Calendar.YEAR),
				calendar.get(Calendar.MONTH),
				calendar.get(Calendar.DAY_OF_MONTH), dateChangeListener);

		// 把我们的view设置给dialog
		builder.setView(view);

		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				Toast.makeText(Main.this, "点击了日期确定按钮", Toast.LENGTH_SHORT).show();
			}

		});

		builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				Toast.makeText(Main.this, "点击了日期取消按钮", Toast.LENGTH_SHORT).show();
			}
		});

		builder.create().show();
	}

	/**
	 * @author kk_imgod
	 *日期改变的监听类,有一点需要注意
	 */
	public class MyDateChangeListener implements OnDateChangedListener {
		@Override
		public void onDateChanged(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			Toast.makeText(
					Main.this,
					"datechange:" + year + ":" + monthOfYear + ":"
							+ (dayOfMonth + 1), Toast.LENGTH_SHORT).show();
		}

	}

	/**
	 * 显示选择时间的对话框
	 * @param layoutres
	 */
	@SuppressLint("NewApi")
	public void dialogShowTime(int layoutres) {
		MyTimeChangeListener timeChangeListener = new MyTimeChangeListener();
		
		AlertDialog.Builder builder = new Builder(Main.this);
		builder.setTitle("设置时间信息");
		View view = layoutinflater.inflate(layoutres, null);
		timePicker = (TimePicker) view.findViewById(R.id.tp_time);
		// 把我们的view设置给dialog
		builder.setView(view);

		Calendar calendar = Calendar.getInstance();
		timePicker.setIs24HourView(true);
		timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
		timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
		
		timePicker.setOnTimeChangedListener(timeChangeListener);
		
		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				Toast.makeText(Main.this, "点击了时间确定按钮", Toast.LENGTH_SHORT).show();
			}

		});

		builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				Toast.makeText(Main.this, "点击了时间取消按钮", Toast.LENGTH_SHORT).show();
			}
		});

		builder.create().show();
	}

	/**
	 * @author kk_imgod
	 *时间改变的那个监听
	 */
	public class MyTimeChangeListener implements OnTimeChangedListener {

		@Override
		public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
			// TODO Auto-generated method stub
			Toast.makeText(Main.this, "时间 change:"+hourOfDay+":"+minute, Toast.LENGTH_SHORT).show();
		}

	}

}



datePicker.setCalendarViewShown(false);这句代码很重要,不让datepicker显示日历的那种格式
 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值