在我们的实际开发过程中,可能会遇到需要点击个按钮弹出一个对话框让我们选择时间什么的,这个时候我们肯定会首先想到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显示日历的那种格式