咱們都知道,在表單中對數據進行驗證不但無聊並且容易出錯。
(原文地址:http://blog.csdn.net/vector_yi/article/details/24424713)
想象一下,一個表單內有若干個須要日期類型的輸入,而你又不想對這些輸入信息進行日期類型的驗證,你會怎麼作?
這裏有一種解決辦法是,
讓用戶認爲他們是在一個EditText中操做,但其實是一個Button,點擊這個Button時會彈出一個DatePicker。
爲了讓這個方案可行,咱們須要改變這個Button的背景,讓用戶覺得這是一個EditText。
其實很簡單:
- <Button android:id="@+id/details_date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:background="@android :drawable/edit_text" /><!--將Button的背景改成EditText的背景-->
接下來只要在Activity中添加Button的點擊事件,讓它彈出一個DatePicker並將選中的日期設爲Button的Text便可。
- package com.manning.androidhacks.hack009;
-
- import java.util.Calendar;
-
- import android.app.Activity;
- import android.app.DatePickerDialog;
- import android.app.DatePickerDialog.OnDateSetListener;
- import android.app.Dialog;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.DatePicker;
-
- public class MainActivity extends Activity {
-
- private static final int DATE_DIALOG_ID = 0;
-
- private int mYear;
- private int mMonth;
- private int mDay;
- private OnDateSetListener mDateSetListener;
- private Button mDateButton;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- // get the current date
- final Calendar c = Calendar.getInstance();
- mYear = c.get(Calendar.YEAR);
- mMonth = c.get(Calendar.MONTH);
- mDay = c.get(Calendar.DAY_OF_MONTH);
-
- mDateSetListener = new DatePickerDialog.OnDateSetListener() {
- @Override
- public void onDateSet(DatePicker view, int year, int monthOfYear,
- int dayOfMonth) {
- mDateButton.setText(getString(R.string.picked_date_format,
- monthOfYear + 1, dayOfMonth, year));
- }
- };
-
- mDateButton = (Button) findViewById(R.id.details_date);
- mDateButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- showDialog(DATE_DIALOG_ID);
- }
- });
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
- switch (id) {
- case DATE_DIALOG_ID:
- return new DatePickerDialog(this, mDateSetListener, mYear,
- mMonth - 1, mDay);
- }
- return super.onCreateDialog(id);
- }
-
- }
可能你會認爲EditText和Button都繼承自TextView,爲什麼不直接建立一個EditText並添加OnClickListener?
可是Button不容許用戶直接編輯顯示的文字,顯然讓驗證更加安全。
你可能還在堅持,能夠把EditText的Editable屬性設爲false。
可是既然Button存在的意義就是能夠點擊而且不能修改顯示的文字,爲什麼你要強加給EditText一些本來不適合它的屬性讓它變成一個Button?
你也能夠利用TextWatcher來驗證EditText的輸入,但這真的不只無聊並且還費時。