不要再使用findViewById

在通過(guò)AS開(kāi)發(fā)Android APP的一個(gè)鮮為人知的特性就是使用數(shù)據(jù)綁定(data binding)。通過(guò)這種手段伶棒,可以實(shí)現(xiàn)非常多有用的特性钩述,這些會(huì)在我未來(lái)的文章中有所介紹,但有一點(diǎn)最最基礎(chǔ)需要你知道的事情就是去掉了findViewById宛裕。

是否這些代碼是讓你頭疼的

TextView hello = (TextView) findViewById(R.id.hello); 

有很多有用的工具瑟啃,主要用來(lái)消除這些代碼里面類(lèi)似這樣的代碼。但是在AS 1.5或者更高級(jí)的版本中揩尸,官方提供了一個(gè)方法可以替代上面的操作蛹屿。

首先你需要修改你的APP的build.gradle文件,在android的代碼塊后,添加下面的語(yǔ)句

    android {
        …
        dataBinding.enabled = true
    }

接下來(lái)你需要在你的layout文件的最外層添加tag <layout>赖条,用來(lái)替代任何你所使用的ViewGroup:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingBottom="@dimen/activity_vertical_margin"
            tools:context=".MainActivity">

        <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

    </RelativeLayout>
</layout>

這個(gè)layout標(biāo)簽用來(lái)提示AS在進(jìn)行下一步之前需要額外的處理,找到一些有趣的Views并且標(biāo)記他們褂策。所有沒(méi)有添加外層layout標(biāo)簽的的布局是不會(huì)經(jīng)歷多余的處理過(guò)程犹撒,所以你可以在你的程序中不修改其他任何東西的前提下折联,方便的將其他你喜歡的地方。

你所要做的下一鍵事情就是告訴它在運(yùn)行時(shí)載入不同的布局文件识颊。由于這些工作又回到了Eclaire的release诚镰,對(duì)于新的架構(gòu)變化不依賴(lài)加載這些預(yù)處理的布局文件。因此祥款,你需要修改一下你的加載過(guò)程清笨。

對(duì)于一個(gè)Activity,替換之前的:

setContentView(R.layout.hello_world);
TextView hello = (TextView) findViewById(R.id.hello);
hello.setText("Hello World"); // for example, but you'd use
                              // resources, right?

你可以這樣的去加載它:

HelloWorldBinding binding = 
    DataBindingUtil.setContentView(this, R.layout.hello_world);
binding.hello.setText("Hello World"); // you should use resources!

這里你可以看到這樣的一個(gè)類(lèi)刃跛,HelloWorldBinding是通過(guò)hello_world.xml布局文件和具有ID"@+id/hello"的View去分配的一個(gè)你可以使用的final作用域hello抠艾。沒(méi)有轉(zhuǎn)換,沒(méi)有findViewById桨昙。

這種訪(fǎng)問(wèn)views的機(jī)制不但相較于findViewById更加簡(jiǎn)單检号,而且速度也更加快!綁定的過(guò)程對(duì)于一個(gè)布局上的所有Views只需要一次遍歷绊率,就可以注冊(cè)對(duì)應(yīng)的作用域谨敛。若你使用findViewById,你的view層級(jí)需要在每一次的調(diào)用中都去尋找滤否。

還有一件事情脸狸,就是你看到的變量名是通過(guò)駝峰命名法來(lái)的(就像hello_world.xml最后定義為了HelloWorldBinding類(lèi)),所有你給ID"@+id/hello_text"的命名應(yīng)該為helloText藐俺。

若你將布局文件擴(kuò)展到RecyclerView炊甲,ViewPager,或者其他沒(méi)有設(shè)置在Activity的內(nèi)容中的地方欲芹,你需要在通用的類(lèi)中使用通用的類(lèi)型安全的方法調(diào)用卿啡。這里有很多適合LayoutInflater的版本,你只需要挑選一個(gè)你最喜歡的方式菱父。例如:

HelloWorldBinding binding = HelloWorldBinding.inflate(
    getLayoutInflater(), container, attachToContainer);

如果你無(wú)法在ViewGroup的容器中去擴(kuò)展颈娜,你需要去擴(kuò)展View層級(jí)。(這一句翻譯的還是有問(wèn)題)你可以在綁定的時(shí)候通過(guò)getRoot()得到:

linearLayout.addView(binding.getRoot());

現(xiàn)在浙宜,你可能會(huì)想官辽,如果我通過(guò)一些不同的Views用不同的構(gòu)造方法但又要使用一個(gè)布局時(shí)改怎么辦?在布局的預(yù)處理和運(yùn)行時(shí)的階段粟瞬,對(duì)于你所綁定的View IDs生成了一個(gè)類(lèi)同仆,只不過(guò)是將那些你沒(méi)有使用的擴(kuò)展layout設(shè)置為Null。

是不是很神奇裙品?最好玩的部分在于俗批,通過(guò)這種方法在運(yùn)行時(shí)沒(méi)有使用反射俗或,也沒(méi)有使用任何高科技手段。這可以非常簡(jiǎn)單的將你目前的APP接入這種方法岁忘,這會(huì)使得你的工作更加簡(jiǎn)單一點(diǎn)辛慰,并且還可以使你的layouts加載的更加快一點(diǎn)。


第一次翻譯干像,有很多地方還不是很規(guī)范昆雀,不斷學(xué)習(xí)吧。

原始文章地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝠筑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子揩懒,更是在濱河造成了極大的恐慌什乙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件已球,死亡現(xiàn)場(chǎng)離奇詭異臣镣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)智亮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)忆某,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人阔蛉,你說(shuō)我怎么就攤上這事弃舒。” “怎么了状原?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵聋呢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我颠区,道長(zhǎng)削锰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任毕莱,我火速辦了婚禮器贩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朋截。我一直安慰自己蛹稍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布质和。 她就那樣靜靜地躺著稳摄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饲宿。 梳的紋絲不亂的頭發(fā)上厦酬,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天胆描,我揣著相機(jī)與錄音,去河邊找鬼仗阅。 笑死昌讲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的减噪。 我是一名探鬼主播短绸,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筹裕!你這毒婦竟也來(lái)了醋闭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朝卒,失蹤者是張志新(化名)和其女友劉穎证逻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抗斤,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囚企,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑞眼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龙宏。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伤疙,靈堂內(nèi)的尸體忽然破棺而出银酗,到底是詐尸還是另有隱情,我是刑警寧澤徒像,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布花吟,位于F島的核電站,受9級(jí)特大地震影響厨姚,放射性物質(zhì)發(fā)生泄漏衅澈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一谬墙、第九天 我趴在偏房一處隱蔽的房頂上張望今布。 院中可真熱鬧,春花似錦拭抬、人聲如沸部默。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)傅蹂。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間份蝴,已是汗流浹背犁功。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婚夫,地道東北人浸卦。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像案糙,于是被迫代替她去往敵國(guó)和親限嫌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線(xiàn)程时捌,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 這是谷歌官方給我們提供的一個(gè)兼容低版本安卓設(shè)備的軟件包怒医,里面包囊了只有在安卓3.0以上可以使用的api。而view...
    Ten_Minutes閱讀 5,733評(píng)論 1 19
  • Day1: 在代碼中通過(guò)R.string.hello_world可以獲得該字符串的引用奢讨; 在XML中通過(guò)@stri...
    冰凝雪國(guó)閱讀 1,386評(píng)論 0 5
  • 有雨 東風(fēng)7米/秒 我開(kāi)早會(huì)(簡(jiǎn)短的幾句話(huà):要和正能量的人多交流)因?yàn)橐募w照 所以特意洗了頭發(fā)裆熙。果然集體照就是...
    綠豆餅餅閱讀 181評(píng)論 0 0