当前位置: 代码迷 >> Android >> 50个Android开发技能(09 避免用EditText对日期进行验证)
  详细解决方案

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

热度:294   发布时间:2016-04-28 05:58:46.0
50个Android开发技巧(09 避免用EditText对日期进行验证)
我们都知道,在表单中对数据进行验证不但无聊而且容易出错。
(原文地址: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的输入,但这真的不仅无聊而且还费时
  相关解决方案