摘要:前言對(duì)于程序員來(lái)說(shuō)布局文件我們幾乎每天都會(huì)寫(xiě)好幾個(gè)而恰恰是很多每天都會(huì)用到的東西往往因?yàn)榱?xí)慣了而忽略對(duì)其原理的探究對(duì)文件的認(rèn)知反射配置文件定義格式疑問(wèn)大家應(yīng)該都有過(guò)這樣的需求在代碼中根據(jù)實(shí)時(shí)的數(shù)據(jù)通過(guò)代碼動(dòng)態(tài)控制而在使用的過(guò)程中就會(huì)明顯的感
前言
對(duì)于 Android 程序員來(lái)說(shuō), 布局 XML 文件我們幾乎每天都會(huì)寫(xiě)好幾個(gè), 而恰恰是很多每天都會(huì)用到的東西, 往往因?yàn)椤噶?xí)慣了」而忽略對(duì)其原理的探究.
[toc]
對(duì)XML文件的認(rèn)知 反射 & 配置文件 定義格式 & 疑問(wèn)大家應(yīng)該都有過(guò)這樣的需求, 在代碼中根據(jù)實(shí)時(shí)的數(shù)據(jù), 通過(guò)代碼動(dòng)態(tài)控制 UI.
而在使用的過(guò)程中就會(huì)明顯的感覺(jué)到 xml 定義 布局的便利性. 而在使用代碼控制的過(guò)程中, 發(fā)現(xiàn) xml 中出現(xiàn)的屬性在代碼控制時(shí)都有相應(yīng)的 get/set方法. 這不由得使我聯(lián)想到 javaWeb spring 框架的 spring Bean.
而通過(guò)猜想和搜索相關(guān)資料驗(yàn)證, 內(nèi)部確實(shí)是通過(guò)反射機(jī)制實(shí)現(xiàn)的.
使用反射的目的javaWeb 開(kāi)發(fā), SSH 框架中的 spring 強(qiáng)大的 IOC 容器, 通過(guò)注解, XML配置和反射, 實(shí)現(xiàn)了控制反轉(zhuǎn)和依賴注入.
使用spring框架后, 基本見(jiàn)不到new對(duì)象的情況, 而是使用配置文件的形式實(shí)例化對(duì)象.
而反射給我印象深刻的一句話就是:
當(dāng)你的程序編寫(xiě)完成, 并編譯成為可以正常運(yùn)行的軟件后, 如果之后要實(shí)現(xiàn)功能的更改, 是否只能重新編輯源代碼并再次編譯?
目的在于方便重用和減低耦合度, 減少項(xiàng)目變動(dòng)所牽連的組件. 這就需要使用配置文件, 而最常見(jiàn)的配置文件格式就是 xml.
低耦合舉例: 業(yè)務(wù)邏輯代碼中不能夠出現(xiàn)和JDBC有關(guān)的代碼, 日后業(yè)務(wù)擴(kuò)展, 更換數(shù)據(jù)庫(kù)系統(tǒng),業(yè)務(wù)代碼不會(huì)受到影響, 只需要在配置文件中更換反射類名即可更換JDBC實(shí)現(xiàn)類.
Android UI XMLNameSpace
xmlns :意為xml命名空間(name space).
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
相當(dāng)于java文件中的「import」, 命名空間主要是因?yàn)? 不可避免的類名, 屬性名重復(fù), 通過(guò)添加前綴以分類, 保證唯一性.
之后在下方使用android:text時(shí)相當(dāng)于寫(xiě)下了http://schemas.android.com/apk/res/android:text
tools xlmnstools:context=”com.example.test.MainActivity”
標(biāo)示上下文, 也就是相關(guān)聯(lián)的Activity.java文件. 因?yàn)椴季诛@示可以在, AndroidManifest.xml,Activity.java,res/layout, 多處同時(shí)定義, 使用此屬性關(guān)聯(lián),以達(dá)到在布局可視化界面, 所見(jiàn)即所得的效果.
tools:text
我們經(jīng)常遇到 textView 在代碼中動(dòng)態(tài)定義時(shí), 可視化預(yù)覽界面無(wú)內(nèi)容, 不方便預(yù)覽. 此時(shí)使用android:text=””臨時(shí)預(yù)覽有可能忘記刪除. 這時(shí)就用到了 tools: 命名空間.
Tools:text=”” 會(huì)在可視化界面顯示, 而不會(huì)在實(shí)際運(yùn)行時(shí)生效.
在顯示布局時(shí), 框架會(huì)讀取指定目錄下的xml文本, 通過(guò)遞歸遍歷整個(gè)布局樹(shù)形嵌套結(jié)構(gòu). 再經(jīng)過(guò)反射形成內(nèi)存中的對(duì)象. (根元素-子元素結(jié)構(gòu) 類比 文件夾-文件結(jié)構(gòu)).
LinearLayout 為元素名,對(duì)應(yīng)經(jīng)過(guò)反射后生成的類名.
其后以鍵值對(duì)形式定義.是在初始化LinearLayout對(duì)象的成員屬性, 相當(dāng)于構(gòu)造器.
用于自定義控件中的自定義屬性命名空間
總結(jié)通過(guò)以上的探究過(guò)程, 也就解釋了, 為什么控件存在兩種使用方式, 而且代碼中調(diào)用的方法名和屬性名與XML文件中極其相似的現(xiàn)象. 而遵從”低耦合”的軟件項(xiàng)目設(shè)計(jì)思想, 同時(shí)抽取組件定義方便重用和更改, Google官方推薦在XML中定義組件也是理所應(yīng)當(dāng)?shù)?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110351.html
閱讀 3204·2021-11-23 09:51
閱讀 716·2021-10-14 09:43
閱讀 3243·2021-09-06 15:00
閱讀 2434·2019-08-30 15:54
閱讀 2587·2019-08-30 13:58
閱讀 1902·2019-08-29 13:18
閱讀 1408·2019-08-27 10:58
閱讀 547·2019-08-27 10:53