我们都知道,在表单中对数据进行验证不但无聊并且easy出错。
(原文地址:http://blog.csdn.net/vector_yi/article/details/24424713)
(原文地址:http://blog.csdn.net/vector_yi/article/details/24424713)
想象一下,一个表单内有若干个须要日期类型的输入,而你又不想对这些输入信息进行日期类型的验证,你会怎么做?
这里有一种解决的方法是,让用户觉得他们是在一个EditText中操作,但实际上是一个Button,点击这个Button时会弹出一个DatePicker。
为了让这个方法可行,我们须要改变这个Button的背景,让用户以为这是一个EditText。
事实上非常easy:
<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的输入,但这真的不仅无聊并且还费时。