Android UI : XML & 反射

Android UI:XML解析与反射机制揭秘
本文探讨了Android UI中XML布局的重要性,并深入解析了反射在Android开发中的作用。通过对XML文件的理解,揭示了Android如何利用反射将XML转换为运行时的对象。文中详细阐述了反射的目的,如降低耦合度和提高代码重用性,并通过Spring框架举例说明。此外,还介绍了XML命名空间(xmlns)的概念,包括`android`、`tools`和`app`,以及它们在构建布局时的作用。

前言

对于 Android 程序员来说, 布局 XML 文件我们几乎每天都会写好几个, 而恰恰是很多每天都会用到的东西, 往往因为「习惯了」而忽略对其原理的探究.

对XML文件的认知

反射 & 配置文件

定义格式 & 疑问

大家应该都有过这样的需求, 在代码中根据实时的数据, 通过代码动态控制 UI.
而在使用的过程中就会明显的感觉到 xml 定义 布局的便利性. 而在使用代码控制的过程中, 发现 xml 中出现的属性在代码控制时都有相应的 get/set方法. 这不由得使我联想到 javaWeb spring 框架的 spring Bean.

而通过猜想和搜索相关资料验证, 内部确实是通过反射机制实现的.

使用反射的目的

javaWeb 开发, SSH 框架中的 spring 强大的 IOC 容器, 通过注解, XML配置和反射, 实现了控制反转和依赖注入.

使用spring框架后, 基本见不到new对象的情况, 而是使用配置文件的形式实例化对象.

而反射给我印象深刻的一句话就是:

当你的程序编写完成, 并编译成为可以正常运行的软件后, 如果之后要实现功能的更改, 是否只能重新编辑源代码并再次编译?

目的在于方便重用和减低耦合度, 减少项目变动所牵连的组件. 这就需要使用配置文件, 而最常见的配置文件格式就是 xml.

低耦合举例: 业务逻辑代码中不能够出现和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中定义组件也是理所应当的.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值