Android UI : XML & 反射

前言

對于 Android 程序員來說, 布局 XML 文件我們幾乎每天都會寫好幾個, 而恰恰是很多每天都會用到的東西, 往往因?yàn)椤噶?xí)慣了」而忽略對其原理的探究.

[toc]

對XML文件的認(rèn)知

反射 & 配置文件

定義格式 & 疑問

大家應(yīng)該都有過這樣的需求, 在代碼中根據(jù)實(shí)時的數(shù)據(jù), 通過代碼動態(tài)控制 UI.
而在使用的過程中就會明顯的感覺到 xml 定義 布局的便利性. 而在使用代碼控制的過程中, 發(fā)現(xiàn) xml 中出現(xiàn)的屬性在代碼控制時都有相應(yīng)的 get/set方法. 這不由得使我聯(lián)想到 javaWeb spring 框架的 spring Bean.

而通過猜想和搜索相關(guān)資料驗(yàn)證, 內(nèi)部確實(shí)是通過反射機(jī)制實(shí)現(xiàn)的.

使用反射的目的

javaWeb 開發(fā), SSH 框架中的 spring 強(qiáng)大的 IOC 容器, 通過注解, XML配置和反射, 實(shí)現(xiàn)了控制反轉(zhuǎn)和依賴注入.

使用spring框架后, 基本見不到new對象的情況, 而是使用配置文件的形式實(shí)例化對象.

而反射給我印象深刻的一句話就是:

當(dāng)你的程序編寫完成, 并編譯成為可以正常運(yùn)行的軟件后, 如果之后要實(shí)現(xiàn)功能的更改, 是否只能重新編輯源代碼并再次編譯?

目的在于方便重用和減低耦合度, 減少項(xiàng)目變動所牽連的組件. 這就需要使用配置文件, 而最常見的配置文件格式就是 xml.

低耦合舉例: 業(yè)務(wù)邏輯代碼中不能夠出現(xiàn)和JDBC有關(guān)的代碼, 日后業(yè)務(wù)擴(kuò)展, 更換數(shù)據(jù)庫系統(tǒng),業(yè)務(wù)代碼不會受到影響, 只需要在配置文件中更換反射類名即可更換JDBC實(shí)現(xiàn)類.

Android UI XML

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <Button
        android:id="@+id/btn_demo"
        android:onClick="setAnimation"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="動畫集合" />

</LinearLayout>

NameSpace

xmlns :意為xml命名空間(name space).

相當(dāng)于java文件中的「import」, 命名空間主要是因?yàn)? 不可避免的類名, 屬性名重復(fù), 通過添加前綴以分類, 保證唯一性.

之后在下方使用android:text時相當(dāng)于寫下了http://schemas.android.com/apk/res/android:text

tools xlmns

tools:context=”com.example.test.MainActivity”

標(biāo)示上下文, 也就是相關(guān)聯(lián)的Activity.java文件. 因?yàn)椴季诛@示可以在, AndroidManifest.xml,Activity.java,res/layout, 多處同時定義, 使用此屬性關(guān)聯(lián),以達(dá)到在布局可視化界面, 所見即所得的效果.

tools:text

我們經(jīng)常遇到 textView 在代碼中動態(tài)定義時, 可視化預(yù)覽界面無內(nèi)容, 不方便預(yù)覽. 此時使用android:text=””臨時預(yù)覽有可能忘記刪除. 這時就用到了 tools: 命名空間.
Tools:text=”” 會在可視化界面顯示, 而不會在實(shí)際運(yùn)行時生效.

在顯示布局時, 框架會讀取指定目錄下的xml文本, 通過遞歸遍歷整個布局樹形嵌套結(jié)構(gòu). 再經(jīng)過反射形成內(nèi)存中的對象. (根元素-子元素結(jié)構(gòu) 類比 文件夾-文件結(jié)構(gòu)).

<LinearLayout/>或者<LinearLayout></LinearLayout>為一個元素,兩種格式以其中是否有子元素來區(qū)分.上方 xml 示例中 : 此時 LinearLayout 下有子元素 Button

LinearLayout 為元素名,對應(yīng)經(jīng)過反射后生成的類名.
其后以鍵值對形式定義.是在初始化LinearLayout對象的成員屬性, 相當(dāng)于構(gòu)造器.

app xmlns

用于自定義控件中的自定義屬性命名空間

總結(jié)

通過以上的探究過程, 也就解釋了, 為什么控件存在兩種使用方式, 而且代碼中調(diào)用的方法名和屬性名與XML文件中極其相似的現(xiàn)象. 而遵從”低耦合”的軟件項(xiàng)目設(shè)計(jì)思想, 同時抽取組件定義方便重用和更改, Google官方推薦在XML中定義組件也是理所應(yīng)當(dāng)?shù)?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匕争,隨后出現(xiàn)的幾起案子避乏,更是在濱河造成了極大的恐慌,老刑警劉巖甘桑,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍皮,死亡現(xiàn)場離奇詭異,居然都是意外死亡跑杭,警方通過查閱死者的電腦和手機(jī)铆帽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來德谅,“玉大人爹橱,你說我怎么就攤上這事≌觯” “怎么了愧驱?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長椭盏。 經(jīng)常有香客問我组砚,道長,這世上最難降的妖魔是什么掏颊? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任糟红,我火速辦了婚禮艾帐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盆偿。我一直安慰自己柒爸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布陈肛。 她就那樣靜靜地躺著揍鸟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪句旱。 梳的紋絲不亂的頭發(fā)上阳藻,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音谈撒,去河邊找鬼腥泥。 笑死,一個胖子當(dāng)著我的面吹牛啃匿,可吹牛的內(nèi)容都是我干的蛔外。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼溯乒,長吁一口氣:“原來是場噩夢啊……” “哼夹厌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裆悄,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤矛纹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后光稼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體或南,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年艾君,在試婚紗的時候發(fā)現(xiàn)自己被綠了采够。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡冰垄,死狀恐怖蹬癌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虹茶,我是刑警寧澤冀瓦,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站写烤,受9級特大地震影響翼闽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洲炊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一感局、第九天 我趴在偏房一處隱蔽的房頂上張望尼啡。 院中可真熱鬧,春花似錦询微、人聲如沸崖瞭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽书聚。三九已至,卻和暖如春藻雌,著一層夾襖步出監(jiān)牢的瞬間雌续,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工胯杭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驯杜,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓做个,卻偏偏與公主長得像鸽心,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子居暖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理顽频,服務(wù)發(fā)現(xiàn),斷路器太闺,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • 文丨曉寒 猴子輾轉(zhuǎn)幾個人跟束,打聽到我的微信和電話。 十幾年未見的老同學(xué)丑孩,無限感嘆與噓唏冀宴,電話掛掉又在微信上發(fā)了幾張近...
    喵淼電影閱讀 228評論 0 0
  • 此次論壇主題是躍起,古典老師首先分享温学。他分享的主要內(nèi)容有1略贮,大腦不是用來放知識,而是用來提問題的仗岖。因?yàn)闄C(jī)器存儲知識...
    啟萌生涯閱讀 412評論 0 0
  • 已經(jīng)在記憶當(dāng)中找不到上一次看到彩虹是什么時候逃延,什么樣子了。 去西藏去敦煌的時候轧拄,在高原揽祥,在沙漠,看到火燒云檩电,看到海...
    荷花_曼曼閱讀 519評論 0 1