50个Android开发技巧(09 避免用EditText对日期进行验证)
2014-04-28 16:58
435 查看
我们都知道,在表单中对数据进行验证不但无聊而且容易出错。
(原文地址:/article/1336215.html)
想象一下,一个表单内有若干个需要日期类型的输入,而你又不想对这些输入信息进行日期类型的验证,你会怎么做?
这里有一种解决办法是,让用户认为他们是在一个EditText中操作,但实际上是一个Button,点击这个Button时会弹出一个DatePicker。
为了让这个方案可行,我们需要改变这个Button的背景,让用户以为这是一个EditText。
其实很简单:
[html] view
plaincopy
<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即可。
[java] view
plaincopy
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);
}
}
[align=left]可能你会认为EditText和Button都继承自TextView,为何不直接创建一个EditText并添加OnClickListener?[/align]
[align=left]但是Button不允许用户直接编辑显示的文字,显然让验证更加安全。[/align]
[align=left]你可能还在坚持,可以把EditText的Editable属性设为false。[/align]
[align=left]但是既然Button存在的意义就是可以点击并且不能修改显示的文字,为何你要强加给EditText一些原本不适合它的属性让它变成一个Button?[/align]
[align=left]你也可以利用TextWatcher来验证EditText的输入,但这真的不仅无聊而且还费时。[/align]
(原文地址:/article/1336215.html)
想象一下,一个表单内有若干个需要日期类型的输入,而你又不想对这些输入信息进行日期类型的验证,你会怎么做?
这里有一种解决办法是,让用户认为他们是在一个EditText中操作,但实际上是一个Button,点击这个Button时会弹出一个DatePicker。
为了让这个方案可行,我们需要改变这个Button的背景,让用户以为这是一个EditText。
其实很简单:
[html] view
plaincopy
<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即可。
[java] view
plaincopy
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);
}
}
[align=left]可能你会认为EditText和Button都继承自TextView,为何不直接创建一个EditText并添加OnClickListener?[/align]
[align=left]但是Button不允许用户直接编辑显示的文字,显然让验证更加安全。[/align]
[align=left]你可能还在坚持,可以把EditText的Editable属性设为false。[/align]
[align=left]但是既然Button存在的意义就是可以点击并且不能修改显示的文字,为何你要强加给EditText一些原本不适合它的属性让它变成一个Button?[/align]
[align=left]你也可以利用TextWatcher来验证EditText的输入,但这真的不仅无聊而且还费时。[/align]
相关文章推荐
- 50个Android开发技巧(09 避免用EditText对日期进行验证)
- 50个Android开发技巧(09 避免用EditText对日期进行验证)
- 50个Android开发技巧(09 避免用EditText对日期进行验证)
- 50个Android开发技巧(09 避免用EditText对日期进行验证)
- Android开发技巧二--避免在EditText中验证日期
- 50个Android开发技巧(02 延迟加载和避免重复渲染视图)
- Android手机开发:EditText+DatePicker带日期选择器的编辑框
- Android开发之将Edittext输入弹出的软键盘设置搜索确定键。详细代码,已验证可用。
- Android手机开发:EditText+DatePicker带日期选择器的编辑框
- 50个Android开发技巧(2,使用延迟加载以及避免代码重复,include和viewstub)
- 50个Android开发技巧(02 延迟载入和避免反复渲染视图)
- 50个Android开发技巧(10 为TextView加入样式)
- Android开发技巧:editText 像QQ一样输入表情图像
- [置顶] Android开发之将Edittext输入弹出的软键盘设置搜索确定键。详细代码,已验证可用。
- Android开发开发技巧之EditText 属性大全
- 50个Android开发技巧(02 延迟加载和避免重复渲染视图)
- 避免在EditText中验证日期
- 50个Android开发技巧(10 为TextView添加样式)
- 50个Android开发技巧(02 延迟加载和避免重复渲染视图)