Hacks控件篇-Hack1 避免在 EditText 中驗(yàn)證日期

EditText 與日期校驗(yàn)

作者:李旺成

時(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)圖所示:

表單校驗(yàn)

使用 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)目地址

AndroidHacks合集
控件使用篇

項(xiàng)目示例代碼:
FormDateValidateActivity.java
activity_formdatevalidate.xml

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巍杈,隨后出現(xiàn)的幾起案子忧饭,更是在濱河造成了極大的恐慌,老刑警劉巖筷畦,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件词裤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鳖宾,警方通過(guò)查閱死者的電腦和手機(jī)吼砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攘滩,“玉大人帅刊,你說(shuō)我怎么就攤上這事∑剩” “怎么了赖瞒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)蚤假。 經(jīng)常有香客問(wèn)我栏饮,道長(zhǎng),這世上最難降的妖魔是什么磷仰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任袍嬉,我火速辦了婚禮,結(jié)果婚禮上灶平,老公的妹妹穿的比我還像新娘伺通。我一直安慰自己,他們只是感情好逢享,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布罐监。 她就那樣靜靜地躺著,像睡著了一般瞒爬。 火紅的嫁衣襯著肌膚如雪弓柱。 梳的紋絲不亂的頭發(fā)上沟堡,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音矢空,去河邊找鬼航罗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屁药,可吹牛的內(nèi)容都是我干的粥血。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酿箭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼立莉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起七问,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茫舶,沒(méi)想到半個(gè)月后械巡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饶氏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年讥耗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疹启。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡古程,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喊崖,到底是詐尸還是另有隱情挣磨,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布荤懂,位于F島的核電站茁裙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏节仿。R本人自食惡果不足惜晤锥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望廊宪。 院中可真熱鬧矾瘾,春花似錦、人聲如沸箭启。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)册烈。三九已至戈泼,卻和暖如春婿禽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背大猛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工扭倾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挽绩。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓膛壹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親唉堪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子模聋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線(xiàn)程,因...
    小菜c閱讀 6,409評(píng)論 0 17
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,759評(píng)論 22 665
  • Android UI相關(guān)開(kāi)源項(xiàng)目庫(kù)匯總OpenDigg 抽屜菜單MaterialDrawer ★7337 - 安卓...
    黃海佳閱讀 8,717評(píng)論 3 77
  • 最近做了一個(gè)Android UI相關(guān)開(kāi)源項(xiàng)目庫(kù)匯總唠亚,里面集合了OpenDigg 上的優(yōu)質(zhì)的Android開(kāi)源項(xiàng)目庫(kù)...
    OpenDigg閱讀 17,199評(píng)論 6 222
  • 我的家鄉(xiāng)是莫言的文學(xué)故土——山東高密链方。近兩年,因?yàn)榭赐馍钏眩蛯?duì)象不斷來(lái)北京居住祟蚀,一般每次兩個(gè)月左右。原來(lái)...
    王進(jìn)會(huì)閱讀 230評(píng)論 0 2