50个Android开发技巧(09 避免用EditText对日期进行验证)

来源:互联网 发布:淘宝联盟怎么自己用 编辑:程序博客网 时间:2024/05/04 04:21
我们都知道,在表单中对数据进行验证不但无聊而且容易出错。
(原文地址:http://blog.csdn.net/vector_yi/article/details/24424713)
想象一下,一个表单内有若干个需要日期类型的输入,而你又不想对这些输入信息进行日期类型的验证,你会怎么做?
这里有一种解决办法是,让用户认为他们是在一个EditText中操作,但实际上是一个Button,点击这个Button时会弹出一个DatePicker。
为了让这个方案可行,我们需要改变这个Button的背景,让用户以为这是一个EditText。
其实很简单:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <Button android:id="@+id/details_date"  
  2. android:layout_width="wrap_content"  
  3. android:layout_height="wrap_content"  
  4. android:gravity="center_vertical"  
  5. android:background="@android:drawable/edit_text" /><!--将Button的背景改为EditText的背景-->  

接下来只要在Activity中添加Button的点击事件,让它弹出一个DatePicker并将选中的日期设为Button的Text即可。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.manning.androidhacks.hack009;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.DatePickerDialog;  
  7. import android.app.DatePickerDialog.OnDateSetListener;  
  8. import android.app.Dialog;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.DatePicker;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     private static final int DATE_DIALOG_ID = 0;  
  18.   
  19.     private int mYear;  
  20.     private int mMonth;  
  21.     private int mDay;  
  22.     private OnDateSetListener mDateSetListener;  
  23.     private Button mDateButton;  
  24.   
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.main);  
  29.   
  30.         // get the current date  
  31.         final Calendar c = Calendar.getInstance();  
  32.         mYear = c.get(Calendar.YEAR);  
  33.         mMonth = c.get(Calendar.MONTH);  
  34.         mDay = c.get(Calendar.DAY_OF_MONTH);  
  35.   
  36.         mDateSetListener = new DatePickerDialog.OnDateSetListener() {  
  37.             @Override  
  38.             public void onDateSet(DatePicker view, int year, int monthOfYear,  
  39.                     int dayOfMonth) {  
  40.                 mDateButton.setText(getString(R.string.picked_date_format,  
  41.                         monthOfYear + 1, dayOfMonth, year));  
  42.             }  
  43.         };  
  44.   
  45.         mDateButton = (Button) findViewById(R.id.details_date);  
  46.         mDateButton.setOnClickListener(new OnClickListener() {  
  47.             @Override  
  48.             public void onClick(View v) {  
  49.                 showDialog(DATE_DIALOG_ID);  
  50.             }  
  51.         });  
  52.     }  
  53.   
  54.     @Override  
  55.     protected Dialog onCreateDialog(int id) {  
  56.         switch (id) {  
  57.         case DATE_DIALOG_ID:  
  58.             return new DatePickerDialog(this, mDateSetListener, mYear,  
  59.                     mMonth - 1, mDay);  
  60.         }  
  61.         return super.onCreateDialog(id);  
  62.     }  
  63.   
  64. }  
  65. 可能你会认为EditText和Button都继承自TextView,为何不直接创建一个EditText并添加OnClickListener?
    但是Button不允许用户直接编辑显示的文字,显然让验证更加安全

    你可能还在坚持,可以把EditText的Editable属性设为false。
    但是既然Button存在的意义就是可以点击并且不能修改显示的文字,为何你要强加给EditText一些原本不适合它的属性让它变成一个Button

    你也可以利用TextWatcher来验证EditText的输入,但这真的不仅无聊而且还费时。
0 0
原创粉丝点击