50個Android開發技巧(09 避免用EditText對日期進行驗證)

咱們都知道,在表單中對數據進行驗證不但無聊並且容易出錯。
(原文地址:http://blog.csdn.net/vector_yi/article/details/24424713)
想象一下,一個表單內有若干個須要日期類型的輸入,而你又不想對這些輸入信息進行日期類型的驗證,你會怎麼作?
這裏有一種解決辦法是, 讓用戶認爲他們是在一個EditText中操做,但其實是一個Button,點擊這個Button時會彈出一個DatePicker。
爲了讓這個方案可行,咱們須要改變這個Button的背景,讓用戶覺得這是一個EditText。
其實很簡單:
[html]   view plain copy 在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 plain copy 在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. }  



可能你會認爲EditText和Button都繼承自TextView,爲什麼不直接建立一個EditText並添加OnClickListener?
可是Button不容許用戶直接編輯顯示的文字,顯然讓驗證更加安全

你可能還在堅持,能夠把EditText的Editable屬性設爲false。
可是既然Button存在的意義就是能夠點擊而且不能修改顯示的文字,爲什麼你要強加給EditText一些本來不適合它的屬性讓它變成一個Button

你也能夠利用TextWatcher來驗證EditText的輸入,但這真的不只無聊並且還費時
相關文章
相關標籤/搜索