Android UI : XML & 反射

前言java

對於 Android 程序員來講, 佈局 XML 文件咱們幾乎天天都會寫好幾個, 而偏偏是不少天天都會用到的東西, 每每由於「習慣了」而忽略對其原理的探究.android

[toc]程序員

對XML文件的認知

反射 & 配置文件

定義格式 & 疑問

你們應該都有過這樣的需求, 在代碼中根據實時的數據, 經過代碼動態控制 UI.
而在使用的過程當中就會明顯的感受到 xml 定義 佈局的便利性. 而在使用代碼控制的過程當中, 發現 xml 中出現的屬性在代碼控制時都有相應的 get/set方法. 這不禁得使我聯想到 javaWeb spring 框架的 spring Bean.spring

而經過猜測和搜索相關資料驗證, 內部確實是經過反射機制實現的.數據庫

使用反射的目的

javaWeb 開發, SSH 框架中的 spring 強大的 IOC 容器, 經過註解, XML配置和反射, 實現了控制反轉和依賴注入.app

使用spring框架後, 基本見不到new對象的狀況, 而是使用配置文件的形式實例化對象.框架

而反射給我印象深入的一句話就是:佈局

當你的程序編寫完成, 並編譯成爲能夠正常運行的軟件後, 若是以後要實現功能的更改, 是否只能從新編輯源代碼並再次編譯?動畫

目的在於方便重用和減低耦合度, 減小項目變更所牽連的組件. 這就須要使用配置文件, 而最多見的配置文件格式就是 xml.spa

低耦合舉例: 業務邏輯代碼中不可以出現和JDBC有關的代碼, 往後業務擴展, 更換數據庫系統,業務代碼不會受到影響, 只須要在配置文件中更換反射類名便可更換JDBC實現類.

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).

  • 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"

至關於java文件中的「import」, 命名空間主要是由於, 不可避免的類名, 屬性名重複, 經過添加前綴以分類, 保證惟一性.

以後在下方使用android:text時至關於寫下了http://schemas.android.com/apk/res/android:text

tools xlmns

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

標示上下文, 也就是相關聯的Activity.java文件. 由於佈局顯示能夠在, AndroidManifest.xml,Activity.java,res/layout, 多處同時定義, 使用此屬性關聯,以達到在佈局可視化界面, 所見即所得的效果.

tools:text

咱們常常遇到 textView 在代碼中動態定義時, 可視化預覽界面無內容, 不方便預覽. 此時使用android:text=」」臨時預覽有可能忘記刪除. 這時就用到了 tools: 命名空間.
Tools:text=」」 會在可視化界面顯示, 而不會在實際運行時生效.

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

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

LinearLayout 爲元素名,對應通過反射後生成的類名.
其後以鍵值對形式定義.是在初始化LinearLayout對象的成員屬性, 至關於構造器.

app xmlns

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

總結

經過以上的探究過程, 也就解釋了, 爲何控件存在兩種使用方式, 並且代碼中調用的方法名和屬性名與XML文件中極其類似的現象. 而聽從」低耦合」的軟件項目設計思想, 同時抽取組件定義方便重用和更改, Google官方推薦在XML中定義組件也是理所應當的.

相關文章
相關標籤/搜索