android开发同时选择日期和时间,datePicker和timePick结合使用为DateAndTimeDialog.java
参考大佬博客:安卓原生时间选择器,DatePicker和TimePicker并用,弹窗dialog
在大佬代码的基础上做了点完善已经补充 分别为
- 多个TextView选择日期时间时TextView的回写问题(构造方法增加view id)
- 改弹窗时间选择器的初始时间为24h制度(改写InitDialog方法)
- 增加getDate和getDateTime方法,方便多次复用
详细代码如下
//弹窗类 DateAndTimeDialog.java
public class DateAndTimeDialog {
private Context mContext;
private AlertDialog.Builder mAlertDialog;
private int mHour, mMinute;
private TimePickerDialogInterface timePickerDialogInterface;
private TimePicker mTimePicker;
private DatePicker mDatePicker;
private int mTag = 0;
private int mYear, mDay, mMonth;
private int viewCode;
public DateAndTimeDialog(Context context,int viewCode) {
super();
mContext = context;
timePickerDialogInterface = (TimePickerDialogInterface) context;
this.viewCode=viewCode;
}
/**
* 初始化DatePicker
*
* @return
*/
private View initDatePicker() {
View inflate = LayoutInflater.from(mContext).inflate(
R.layout.datepicker_layout, null);
mDatePicker = (DatePicker) inflate
.findViewById(R.id.datePicker);
resizePikcer(mDatePicker);
return inflate;
}
/**
* 初始化TimePicker
*
* @return
*/
private View initTimePicker() {
View inflate = LayoutInflater.from(mContext).inflate(
R.layout.timepicker_layout, null);
mTimePicker = (TimePicker) inflate
.findViewById(R.id.timePicker);
mTimePicker.setIs24HourView(true);
resizePikcer(mTimePicker);
return inflate;
}
private View initDateAndTimePicker() {
View inflate = LayoutInflater.from(mContext).inflate(
R.layout.dateandtimepicker_layout, null);
mTimePicker = (TimePicker) inflate
.findViewById(R.id.dateAndTimePicker_timePicker);
mDatePicker = (DatePicker) inflate
.findViewById(R.id.dateAndTimePicker_datePicker);
mTimePicker.setIs24HourView(true);
resizePikcer(mTimePicker);
resizePikcer(mDatePicker);
return inflate;
}
/**
* 创建dialog
*
* @param view
*/
private void initDialog(View view) {
Calendar calendar=Calendar.getInstance();
mTimePicker.setCurrentHour(calendar.get(calendar.HOUR_OF_DAY));
mAlertDialog.setPositiveButton("确定",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
if (mTag == 0) {
getTimePickerValue();
} else if (mTag == 1) {
getDatePickerValue();
} else if (mTag == 2) {
getDatePickerValue();
getTimePickerValue();
}
timePickerDialogInterface.positiveListener(viewCode);
}
});
mAlertDialog.setNegativeButton("取消",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
timePickerDialogInterface.negativeListener();
dialog.dismiss();
}
});
mAlertDialog.setView(view);
}
/**
* 显示时间选择器
*/
public void showTimePickerDialog() {
mTag=0;
View view = initTimePicker();
mAlertDialog = new AlertDialog.Builder(mContext);
mAlertDialog.setTitle("选择时间");
initDialog(view);
mAlertDialog.show();
}
/**
* 显示日期选择器
*/
public void showDatePickerDialog() {
mTag=1;
View view = initDatePicker();
mAlertDialog = new AlertDialog.Builder(mContext);
mAlertDialog.setTitle("选择时间");
initDialog(view);
mAlertDialog.show();
}
/**
* 显示日期时间选择器
*/
public void showDateAndTimePickerDialog() {
mTag=2;
View view = initDateAndTimePicker();
mAlertDialog = new AlertDialog.Builder(mContext);
mAlertDialog.setTitle("选择时间");
initDialog(view);
mAlertDialog.show();
}
/*
* 调整numberpicker大小
*/
private void resizeNumberPicker(NumberPicker np) {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(120,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(10, 0, 10, 0);
np.setLayoutParams(params);
}
/**
* 调整FrameLayout大小
*
* @param tp
*/
private void resizePikcer(FrameLayout tp) {
List<NumberPicker> npList = findNumberPicker(tp);
for (NumberPicker np : npList) {
resizeNumberPicker(np);
}
}
/**
* 得到viewGroup里面的numberpicker组件
*
* @param viewGroup
* @return
*/
private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {
List<NumberPicker> npList = new ArrayList<NumberPicker>();
View child = null;
if (null != viewGroup) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
child = viewGroup.getChildAt(i);
if (child instanceof NumberPicker) {
npList.add((NumberPicker) child);
} else if (child instanceof LinearLayout) {
List<NumberPicker> result = findNumberPicker((ViewGroup) child);
if (result.size() > 0) {
return result;
}
}
}
}
return npList;
}
public String getDate(){
StringBuffer sb=new StringBuffer("");
sb.append(mYear+"-");
if(mMonth<10){
sb.append(0);
}
sb.append(mMonth+"-");
if(mDay<10){
sb.append(0);
}
sb.append(mDay+" ");
if(mHour<10){
sb.append(0);
}
return sb.toString();
}
public String getDateTime(){
StringBuffer sb=new StringBuffer("");
sb.append(mYear+"-");
if(mMonth<10){
sb.append(0);
}
sb.append(mMonth+"-");
if(mDay<10){
sb.append(0);
}
sb.append(mDay+" ");
if(mHour<10){
sb.append(0);
}
sb.append(mHour);
if(mMinute<10){
sb.append(0);
}
sb.append(":"+mMinute);
return sb.toString();
}
public int getYear() {
return mYear;
}
public int getDay() {
return mDay;
}
public int getMonth() {
//返回的时间是0-11
return mMonth+1;
}
public int getMinute() {
return mMinute;
}
public int getHour() {
return mHour;
}
/**
* 获取日期选择的值
*/
private void getDatePickerValue() {
mYear = mDatePicker.getYear();
mMonth = mDatePicker.getMonth();
mDay= mDatePicker.getDayOfMonth();
}
/**
* 获取时间选择的值
*/
private void getTimePickerValue() {
// api23这两个方法过时
mHour = mTimePicker.getCurrentHour();// timePicker.getHour();
mMinute = mTimePicker.getCurrentMinute();// timePicker.getMinute();
}
public interface TimePickerDialogInterface {
public void positiveListener(int viewCode);
public void negativeListener();
}
}
// 三个布局文件
//dateandtimepicker_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent">
<DatePicker
android:id="@+id/dateAndTimePicker_datePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:datePickerMode="spinner"
android:calendarViewShown="false"
/>
<TimePicker
android:id="@+id/dateAndTimePicker_timePicker"
android:timePickerMode="spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
// datepicker_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent">
<DatePicker
android:id="@+id/datePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:calendarViewShown="false"
android:datePickerMode="spinner"
/>
</LinearLayout>
// timepicker_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent">
<TimePicker
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:timePickerMode="spinner"
/>
</LinearLayout>
// activity_test.xml 的部分
<TextView
android:id="@+id/Create_Time1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="(选择时间)"
android:textColor="#999"
android:textSize="15sp" />
<TextView
android:id="@+id/Create_Time2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="(选择时间)"
android:textColor="#999"
android:textSize="15sp" />
// TestActivity.java
public class TestActivity extends AppCompatActivity implements DateAndTimeDialog.TimePickerDialogInterface {
private TextView Create_Time1,Create_Time2;
private DateAndTimeDialog dateAndTimeDialog;
private Calendar cal;
private int year,month,day;
private void init(){
Create_Time1=findViewById(R.id.Create_Time1);
Create_Time2=findViewById(R.id.Create_Time2);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
init();
Create_Time1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dateAndTimeDialog=new DateAndTimeDialog(TestActivity.this,R.id.Create_Time1);
dateAndTimeDialog.showDateAndTimePickerDialog();
}
});
Create_Time2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dateAndTimeDialog=new DateAndTimeDialog(TestActivity.this,R.id.Create_Time2);
dateAndTimeDialog.showDateAndTimePickerDialog();
}
});
}
@Override
public void positiveListener(int viewCode) {
TextView textView=findViewById(viewCode);
textView.setText(dateAndTimeDialog.getDateTime());
}
@Override
public void negativeListener() {
}