作者:李旺成
時(shí)間:2016年5月13日
這個(gè) Hack 將介紹關(guān)于表單校驗(yàn)中的一個(gè)小技巧。
表單檢驗(yàn)
大部分開(kāi)發(fā)者應(yīng)該都遇到過(guò)“表單校驗(yàn)”的問(wèn)題缓升,該問(wèn)題令人厭煩也容易出錯(cuò)。
假設(shè),有這樣一個(gè)需求囤萤,需要使用大量的日期輸入框纯出。具體的要求是這樣的蚯妇,點(diǎn)擊輸入框之后,彈出一個(gè)日期選擇器(DatePickerDialog)暂筝,將選中的日期填充到輸入框中箩言。具體效果,如下動(dòng)態(tài)圖所示:
使用 EditText 的弊端
示意圖中的第一個(gè)輸入框是一個(gè) EditText焕襟,要實(shí)現(xiàn)上面的需求很簡(jiǎn)單陨收。為 EditText 設(shè)置點(diǎn)擊監(jiān)聽(tīng),點(diǎn)擊輸入框的時(shí)候就彈出 DatePickerDialog鸵赖,用戶(hù)對(duì) DatePickerDialog 的操作务漩,最終會(huì)通過(guò)回調(diào)反應(yīng)到 EditText 中。(具體代碼它褪,見(jiàn)示例項(xiàng)目吧6恰)
但是使用 EditText 是有弊端的,下面會(huì)分析這些弊端茫打。
EditText “不安全”
EditText 是一個(gè)可以輸入的控件居触,當(dāng)用戶(hù)通過(guò) DatePickerDialog 選擇了日期之后,用戶(hù)仍然可以通過(guò)光標(biāo)獲取 EditText 的焦點(diǎn)老赤。這樣便可以繞過(guò) DatePicker 控件來(lái)直接修改 EditText 的文本內(nèi)容轮洋。
正因?yàn)檫@一點(diǎn),所以說(shuō) EditText “不安全”抬旺,它的內(nèi)容可以編輯弊予,破壞了設(shè)計(jì)者使用 DatePicker 來(lái)選擇日期的初衷。
不建議使用 TextWatcher
當(dāng)然嚷狞,可以通過(guò)給 EditText 設(shè)置 TextWatcher 來(lái)驗(yàn)證 EditText 中的文本块促。但是,這種方法繁瑣床未、低效而且耗時(shí)竭翠。
那有什么建議呢?
使用 Button 或者 TextView
上面介紹了使用 EditText 來(lái)實(shí)現(xiàn)上述需求的“弊端”薇搁,那更好的實(shí)踐就是去除這些“弊端”斋扰。
這里的思路是:使用一個(gè)外觀(guān)與 EditText 相同的 Button 或者 TextView,然后為該 Button 或 TextView 設(shè)置點(diǎn)擊監(jiān)聽(tīng),點(diǎn)擊時(shí)传货,彈出 DatePickerDialog 即可屎鳍。
簡(jiǎn)單實(shí)現(xiàn)
1、創(chuàng)建布局
activity_formdatevalidate.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
>
...
<TextView
android:id="@+id/tv_tip2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Button 顯示日期"
android:layout_below="@+id/et_date"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_tip2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textAllCaps="false"
android:onClick="onClick"
android:background="@android:drawable/edit_text"/>
</RelativeLayout>
2问裕、顯示 DatePickerDialog
private void initData() {
// 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);
}
new DatePickerDialog(this, mDateSetListener2, mYear, mMonth, mDay).show();
3逮壁、日期變化監(jiān)聽(tīng)
mDateSetListener2 = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
String dateStr = getString(R.string.picked_date_format, monthOfYear,
dayOfMonth, year);
Toast.makeText(
FormDateValidateActivity.this,
dateStr, Toast.LENGTH_SHORT).show();
mDateBtn.setText(dateStr);
}
};
小結(jié)
這個(gè) Hack 僅僅是希望起到拋磚引玉的作用,希望大家以后遇到類(lèi)似的問(wèn)題可稍微用點(diǎn)技巧粮宛,這樣可能會(huì)省時(shí)省力很多窥淆。
項(xiàng)目地址
項(xiàng)目示例代碼:
FormDateValidateActivity.java
activity_formdatevalidate.xml