[android] 解决DatePickerDialog和TimePickerDialog控件取消按钮问题
生活随笔
收集整理的這篇文章主要介紹了
[android] 解决DatePickerDialog和TimePickerDialog控件取消按钮问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一. 問(wèn)題提出
? ? ? 在Android程序中,我們通常需要使用DatePicker來(lái)設(shè)置日期,TimePicker來(lái)設(shè)置時(shí)間。其基本步驟是:
? ? ? ? ? ? ?1.先定義DatePicker和TimePicker布局
? ? ? ? ? ? ?2.然后通過(guò)Calendar類(lèi)獲得系統(tǒng)時(shí)間
? ? ? ? ? ? ?3.接著通過(guò)init方法將日期傳遞給DatePicker初始化日期控件
? ? ? ? ? ? ?4.在響應(yīng)點(diǎn)擊事件中可以通過(guò)DatePicker的getYear()、getDayOfMonth()、getMonth()函數(shù)獲取具體日期
? ? ? 同時(shí)可以在OnDateChangedListener事件中監(jiān)聽(tīng)日期變化,設(shè)置時(shí)間函數(shù)方法同理。但是使用DatePickerDialog或TimePickerDialog控件時(shí)會(huì)遇到的一個(gè)問(wèn)題,它就是android版本4.0后沒(méi)有取消(Cancel)按鈕,同時(shí)點(diǎn)擊界面任何部分都能獲取日期或時(shí)間,據(jù)說(shuō)它是版本存在的BUG。對(duì)比圖如下所示:
??
? ? ? 但是我們期待的效果如下圖所示:
?? ? ? ? 我采取的解決方法是通過(guò)自定義XML布局,經(jīng)過(guò)DatePicker和TimePicker控件實(shí)現(xiàn),同時(shí)在AlertDialog中設(shè)置取消按鈕和確定按鈕,通過(guò)函數(shù)setNegativeButton()和setPositiveButton()實(shí)現(xiàn)。
二. 簡(jiǎn)單實(shí)現(xiàn)日期和時(shí)間控件
? ? ? 簡(jiǎn)單實(shí)現(xiàn)方法非常簡(jiǎn)單,不需要設(shè)置日期或時(shí)間的XML布局,直接通過(guò)new DatePickerDialog或TimePickerDialog即可實(shí)現(xiàn)。代碼如下: //點(diǎn)擊"日期"按鈕布局 設(shè)置日期 layoutDate.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int day) {// TODO Auto-generated method stubmYear = year;mMonth = month;mDay = day;//更新EditText控件日期 小于10加0dateEdit.setText(new StringBuilder().append(mYear).append("-").append((mMonth + 1) < 10 ? "0" + (mMonth + 1) : (mMonth + 1)).append("-").append((mDay < 10) ? "0" + mDay : mDay) ); }}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH) ).show();} });? ? ? 其中mYear、mMonth、mDay是定義變量,同時(shí)dateEdit是一個(gè)EditText控件用于顯示具體日期,當(dāng)數(shù)字小于10時(shí)前補(bǔ)0,如2015-01-01。下面是設(shè)置時(shí)間,顯示效果和第三部分的效果相同。 //點(diǎn)擊"時(shí)間"按鈕布局 設(shè)置時(shí)間 layoutTime.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new TimePickerDialog(MainActivity.this,new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hour, int minute) {// TODO Auto-generated method stubmHour = hour;mMinute = minute;//更新EditText控件時(shí)間 小于10加0timeEdit.setText(new StringBuilder().append(mHour < 10 ? "0" + mHour : mHour).append(":").append(mMinute < 10 ? "0" + mMinute : mMinute).append(":00") ); }}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), true).show();} });
三. 自定義布局實(shí)現(xiàn)
? ? ? 下面是自定義布局實(shí)現(xiàn),而且我自認(rèn)為該界面布局非常好看,這也是我“隨手拍”項(xiàng)目自己最后總結(jié)出來(lái)的一個(gè)比較欣賞的界面吧!希望你也喜歡,效果如下:
????
? ? ? 如圖所示,界面中日期、時(shí)間EditText不可編輯,需要通過(guò)點(diǎn)擊底部布局來(lái)設(shè)置。同時(shí)備注信息的EditText通過(guò)自定義背景實(shí)現(xiàn),設(shè)置日期、時(shí)間中有取消按鈕。
? ? ? 源代碼:? ? ? ?1.項(xiàng)目結(jié)構(gòu)如下圖所示
? ? ? 2.activity_main.xml布局文件
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><!-- 頂部路徑 --><RelativeLayout android:id="@+id/MyLayout_top"android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="40dp" android:background="@drawable/top"android:layout_alignParentTop="true"android:gravity="center"><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="25sp"android:textColor="#ffffff"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:text="行程備注信息" /></RelativeLayout><!-- 底部按鈕 --><RelativeLayoutandroid:id="@+id/MyLayout_bottom"android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="55dp"android:layout_alignParentBottom="true"android:background="@drawable/down"android:gravity="center"><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:layout_alignParentBottom="true" ><LinearLayout android:id="@+id/layout_date" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1"android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/image_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" android:src="@drawable/image_icon_date" /> <TextView android:id="@+id/textview_date"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="日期" android:textColor="#000000" android:textSize="10sp" /> </LinearLayout> <LinearLayout android:id="@+id/layout_time" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1"android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/image_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" android:src="@drawable/image_icon_time" /> <TextView android:id="@+id/textview_time"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="時(shí)間" android:textColor="#000000" android:textSize="10sp" /> </LinearLayout> <LinearLayout android:id="@+id/layout_cancel" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1"android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/image_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" android:src="@drawable/image_icon_cancel" /> <TextView android:id="@+id/textview_cancel"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="取消" android:textColor="#000000" android:textSize="10sp" /> </LinearLayout><LinearLayout android:id="@+id/layout_save" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1"android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/image_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" android:src="@drawable/image_icon_save" /> <TextView android:id="@+id/textview_save"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:textColor="#000000" android:textSize="10sp" /> </LinearLayout> </LinearLayout> </RelativeLayout><!-- 顯示圖片 --><RelativeLayoutandroid:id="@+id/Content_Layout" android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_above="@id/MyLayout_bottom" android:layout_below="@id/MyLayout_top"android:background="#eee8cc"android:gravity="center"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_alignParentBottom="true" ><TextViewandroid:layout_width="wrap_content"android:layout_height="30dp"android:textColor="#000000"android:text="主 題"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"android:textSize="20dp" /><EditText android:id="@+id/showtitle" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_marginTop="10dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:hint="旅行主題"android:layout_weight="1"android:textSize="20dp"android:textColor="#000000"android:paddingLeft="20dp" /> </LinearLayout><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_alignParentBottom="true" ><TextViewandroid:layout_width="wrap_content"android:layout_height="30dp"android:textColor="#000000"android:text="日 期"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"android:textSize="20dp" /><EditText android:id="@+id/showdate" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_marginTop="10dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:hint="2015-01-01"android:layout_weight="1"android:textSize="20dp"android:textColor="#000000"android:editable="false"android:paddingLeft="20dp" /> </LinearLayout><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_alignParentBottom="true" ><TextViewandroid:layout_width="wrap_content"android:layout_height="30dp"android:textColor="#000000"android:text="時(shí) 間"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"android:textSize="20dp" /><EditText android:id="@+id/showtime" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_marginTop="10dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:hint="00:00:00"android:layout_weight="1"android:textSize="20dp"android:textColor="#000000"android:editable="false"android:paddingLeft="20dp" /> </LinearLayout><LinearLayout android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal"android:layout_alignParentBottom="true" ><!-- 設(shè)置運(yùn)行多行 設(shè)置圓角圖形 黑色字體android:lineSpacingExtra設(shè)置行間距android:typeface設(shè)置字體android:paddingLeft設(shè)置距離--><EditText android:id="@+id/editText1"android:layout_height="fill_parent"android:layout_width="fill_parent"android:textColor="#000000"android:layout_margin="20dp"android:textSize="20sp"android:hint="記錄旅途中的備注信息..."android:maxLength="500"android:lineSpacingExtra="5dip"android:typeface="sans" android:paddingLeft="20dp"android:paddingRight="20dp"android:paddingTop="10dp" android:singleLine="false"android:background="@drawable/editview_shape"android:gravity="top" /></LinearLayout></LinearLayout></RelativeLayout></RelativeLayout>? ? ? 3.date_dialog.xml文件:日期控件布局
<?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"android:padding="10dip" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="true" android:text="請(qǐng)選擇日期" android:textColor="#000000" android:textSize="16sp" /> <DatePicker android:id="@+id/date_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dip"android:layout_gravity="center" ></DatePicker> </LinearLayout>? ? ? 4.time_dialog.xml文件:時(shí)間控件布局 <?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"android:padding="10dip" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="true" android:text="請(qǐng)選擇日期" android:textColor="#000000" android:textSize="16sp" /> <DatePicker android:id="@+id/date_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dip"android:layout_gravity="center" ></DatePicker> </LinearLayout>? ? ? 5.drawable-hdpi中editview_shape.xml文件 實(shí)現(xiàn)自定義EditText控件格式
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="10dp"><!-- 填充editView的顏色 --><soild android:color="#ffffff"/><!-- 設(shè)置圓角的弧度,radius半徑越大,editView的邊角越圓 --><corners android:radius="15dp"android:bottomRightRadius="15dp"android:bottomLeftRadius="15dp"android:topLeftRadius="15dp" android:topRightRadius="15dp"/><strokeandroid:color="#32CD32" android:width="4px" /> </shape>? ? ? 6.MainActivity.java源碼
public class MainActivity extends Activity {//自定義變量private EditText titleEdit;private EditText dateEdit;private EditText timeEdit;private EditText contentEdit;//底部四個(gè)布局按鈕private LinearLayout layoutDate; private LinearLayout layoutTime; private LinearLayout layoutCancel; private LinearLayout layoutSave;//定義顯示時(shí)間控件private Calendar calendar; //通過(guò)Calendar獲取系統(tǒng)時(shí)間private int mYear;private int mMonth;private int mDay;private int mHour;private int mMinute;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//鎖定屏幕setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);setContentView(R.layout.activity_main);//獲取對(duì)象titleEdit = (EditText) findViewById(R.id.showtitle);dateEdit = (EditText) findViewById(R.id.showdate);timeEdit = (EditText) findViewById(R.id.showtime);contentEdit = (EditText) findViewById(R.id.editText1);layoutDate = (LinearLayout) findViewById(R.id.layout_date);layoutTime = (LinearLayout) findViewById(R.id.layout_time);layoutCancel = (LinearLayout) findViewById(R.id.layout_cancel);layoutSave = (LinearLayout) findViewById(R.id.layout_save);calendar = Calendar.getInstance();//點(diǎn)擊"日期"按鈕布局 設(shè)置日期layoutDate.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//通過(guò)自定義控件AlertDialog實(shí)現(xiàn)AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);View view = (LinearLayout) getLayoutInflater().inflate(R.layout.date_dialog, null);final DatePicker datePicker = (DatePicker) view.findViewById(R.id.date_picker);//設(shè)置日期簡(jiǎn)略顯示 否則詳細(xì)顯示 包括:星期\周datePicker.setCalendarViewShown(false);//初始化當(dāng)前日期calendar.setTimeInMillis(System.currentTimeMillis());datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), null); //設(shè)置date布局builder.setView(view);builder.setTitle("設(shè)置日期信息");builder.setPositiveButton("確 定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //日期格式StringBuffer sb = new StringBuffer(); sb.append(String.format("%d-%02d-%02d", datePicker.getYear(), datePicker.getMonth() + 1, datePicker.getDayOfMonth())); dateEdit.setText(sb); //賦值后面鬧鐘使用mYear = datePicker.getYear();mMonth = datePicker.getMonth();mDay = datePicker.getDayOfMonth();dialog.cancel(); } }); builder.setNegativeButton("取 消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }});builder.create().show();}});layoutDate.setOnTouchListener(new OnTouchListener() { //設(shè)置布局背景@Overridepublic boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) {layoutDate.setBackgroundColor(Color.WHITE);layoutTime.setBackgroundColor(Color.TRANSPARENT);layoutCancel.setBackgroundColor(Color.TRANSPARENT);layoutSave.setBackgroundColor(Color.TRANSPARENT);}return false;}});//點(diǎn)擊"時(shí)間"按鈕布局 設(shè)置時(shí)間layoutTime.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//自定義控件AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);View view = (LinearLayout) getLayoutInflater().inflate(R.layout.time_dialog, null);final TimePicker timePicker = (TimePicker) view.findViewById(R.id.time_picker);//初始化時(shí)間calendar.setTimeInMillis(System.currentTimeMillis());timePicker.setIs24HourView(true); timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(Calendar.MINUTE); //設(shè)置time布局builder.setView(view);builder.setTitle("設(shè)置時(shí)間信息");builder.setPositiveButton("確 定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mHour = timePicker.getCurrentHour();mMinute = timePicker.getCurrentMinute();//時(shí)間小于10的數(shù)字 前面補(bǔ)0 如01:12:00timeEdit.setText(new StringBuilder().append(mHour < 10 ? "0" + mHour : mHour).append(":").append(mMinute < 10 ? "0" + mMinute : mMinute).append(":00") ); dialog.cancel(); } }); builder.setNegativeButton("取 消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }});builder.create().show();}});layoutTime.setOnTouchListener(new OnTouchListener() { //設(shè)置布局背景@Overridepublic boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) {layoutDate.setBackgroundColor(Color.TRANSPARENT);layoutTime.setBackgroundColor(Color.WHITE);layoutCancel.setBackgroundColor(Color.TRANSPARENT);layoutSave.setBackgroundColor(Color.TRANSPARENT);}return false;}});//點(diǎn)擊"取消"按鈕layoutCancel.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {dateEdit.setText("");dateEdit.setHint("2015-01-01");timeEdit.setText("");timeEdit.setHint("00:00:00");contentEdit.setText("");contentEdit.setHint("記錄旅途中的備注信息...");}});layoutCancel.setOnTouchListener(new OnTouchListener() { //設(shè)置布局背景@Overridepublic boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) {layoutDate.setBackgroundColor(Color.TRANSPARENT);layoutTime.setBackgroundColor(Color.TRANSPARENT);layoutCancel.setBackgroundColor(Color.WHITE);layoutSave.setBackgroundColor(Color.TRANSPARENT);}return false;}});//點(diǎn)擊"保存"按鈕layoutSave.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//確認(rèn)保存按鈕new AlertDialog.Builder(MainActivity.this).setTitle("確認(rèn)保存嗎?") .setIcon(android.R.drawable.ic_dialog_info) .setPositiveButton("確 定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { /*** 數(shù)據(jù)庫(kù)插入操作*/}}) .setNegativeButton("返 回", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); }});layoutSave.setOnTouchListener(new OnTouchListener() { //設(shè)置布局背景@Overridepublic boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) {layoutDate.setBackgroundColor(Color.TRANSPARENT);layoutTime.setBackgroundColor(Color.TRANSPARENT);layoutCancel.setBackgroundColor(Color.TRANSPARENT);layoutSave.setBackgroundColor(Color.WHITE);}return false;}});} // End onCreate}? ? ? 最后希望文章對(duì)大家有所幫助!如果你知道我這篇文章想要闡述的內(nèi)容是什么?為什么要寫(xiě)這篇文章?或許它會(huì)對(duì)你有所幫助,一方面是布局可能對(duì)你有啟發(fā);另一方面就是剛好遇到那個(gè)問(wèn)題的同學(xué)。
? ? ? 在點(diǎn)擊“保存”按鈕時(shí),也可把數(shù)據(jù)存儲(chǔ)至數(shù)據(jù)庫(kù)中調(diào)用MySQLiteOpenHelper,這里就不再介紹。寫(xiě)著寫(xiě)著就到了凌晨5點(diǎn)了,程序猿生活還是要改下啊~自己保重自己的身體吧!期待改正自己的作息,難難難~
? ? ? (By:Eastmount 2015-1-7 凌晨5點(diǎn)??http://blog.csdn.net/eastmount/)
總結(jié)
以上是生活随笔為你收集整理的[android] 解决DatePickerDialog和TimePickerDialog控件取消按钮问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [android] 百度地图开发 (二)
- 下一篇: 【学习排序】 Learning to R