【Android学习】XML(Extensible Markup Language,可扩展标记语言)

1,XML(Extensible Markup Language,可扩展标记语言)

1)概念

W3c组织发布的(该公司也发布了html、CSS、xhtml、html5)。

允许用户自定义标签,描述数据关系。

2)场景

A.保存有关系的数据
B.用作软件配置文件,描述程序模块之间的关系。
比如要求软件启动时,启动什么。

3)组成部分

①文档说明

必有。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
当前文档为xml文档,遵循1.0xml版本,编码方式为UTF-8(GB2312),standalone表示文档是否独立

②元素(element)

命名规范:
区分大小写;
不能以数字或下划线、xml开头;
不能包含空格;
中间不能包含冒号。

③属性

用单引号或双引号引起来。
标签属性所代表的信息也可以用子标签来描述。
<input name="text">可以描述为<input><name>text</name></input>

④注释

<!-- -->

⑤CDATA区、特殊字符

在编写 xml文件时,有些内容不想让解析引擎解析执行,而是当作原始内容处理。则把它放在CDATA区。

CDATA区中的呢人会原封不动的输出。

<![CDATA[内容]]>

⑥处理指令(PI,processing instruction)

用来指挥解析引擎如何解析XML文档内容。必须以<?开头,?>结尾。
如指令xml-stylesheet。

<?xml-stylesheet type="text/css" href="1.css"?>

4)xml文件命名规范

(a~z)(0~9)(_)

5)XML约束技术

①XML DTD(文档类型定义Document Type Definitionn)

DTD文件应使用UTF-8或Unicode。在做框架的时候才需要写DTD。
对于本地dtd文档:如文件book.dtd声明xml文档格式,则遵循此dtd文件的xml在写的时候要写:

<!DOCTYPE 书架 SYSTEM "book.dtd">

意思为:所有元素书架,都要遵循dtd文件来写。

或者在xml内部写dtd:

<?xml version="1.0">
<!DOCTYPE 书架[
    <!ELEMENT 书架(书+)>
    <!ELEMENT 书(书名,作者)>
    <!ELEMENT 书名(#PCDATA)>  
    <!ELEMENT 作者(#PCDATA)>  
]>
<书架>
    <书>
        <书名>书名</书名>
        <作者>作者</作者>
    </书>
    …
</书架>

对于公共的网上dtd文档:

<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

②XML Schema

6)style和theme

①相同

style和theme本质上相同,xml格式一致。
用在activity上叫做theme,用在view叫做style。

<resources>
    <style name="myStyle">
        <item name="android:layout_width">fill_parent</item>
    </style>
</resources>

②区别

style可以作用在activity上,但是theme却不能反过来作用在view上。
style控制的某些属性是只有针对Activity才能生效的(比如状态栏等);Activity内部有一个继承自View的Decorview。

③theme的继承

Theme这个类为final,故不能被继承。
在XML种,使用parent可以指明Theme,这不算是类的继承。在XML中解析时,遇到parent之后去parent里解析,然后如此递归,知道解析完各级的父XML之后,再回到子XML解析。是类的继承关系的模拟。

2,语法

1)布局

常用布局有LinearLayout,RelativeLayout,FrameLayout,TableLayout,AbsoluteLayout。

LinearLayout

RelativeLayout

①RelativeLayout中的子view靠右失效
使用android:layout_alignParentRight=”true”时,若同时使用android:layout_toRightOf则会使android:layout_alignParentRight失效。

FrameLayout

注意:帧布局中,第一个布局放在底层,按层次叠放。(注意覆盖问题)

TableLayout

是LinearLayout子类。

<TableLayout><TableRow></TableRow></TableLayout>

3,xml解析

1)SAX(Simple SPI for XML)

①概念

SAX是一种基于事件的解析器,事件驱动的流式解析方式:从文件开始顺序解析到文档的结束,不可暂停或倒退(SAX是单向的)。
它的核心是事件处理模式,主要围绕事件源以及事件处理器来工作。当事件源产生事件后,调用事件处理器相应的方法,一个事件就可以得到处理。再事件源调用事件处理器特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能根据提供的事件信息来觉得自己的行为。

②SAX工作原理

对文档进行顺序扫描,当扫描到文档开始与结束、元素开始与结束、文档结束等地方时通知事件处理函数,由事件处理函数做相应动作 ,然后继续同样的扫描,直至文档结束。

③优缺点

优点:
解析速度快,占用内存少。(不用事先调入整个文档)。
缺点:
对于嵌套多个分支来说处理不方便。

④场景

手机、对性能敏感的数据库使用。

2)DOM(文档对象模型,Document Object Model)

①工作原理

解析文件为独立的元素、属性和注释,然后以节点树的形式在内存中对XML文件进行表示,通过节点树访问文档的内容,并根据需要修改文档。

XML对象组成一个树形结构:
对于整个XML文档来说,是一个Document对象。
每一个标签为一个Element对象。
文本变成一个Text对象。
属性变成Attr对象。
分析文件结构时,通常要加载整个文档并构造树形结构,然后才可以检索和更新节点信息。

②优缺点

优点:检索和更新效率高。(以树形结构存放)
缺点:很耗资源。(把整个XML文件加载到内存中去)

③场景

PC开发使用较多。
如果数据量不是很大,推荐使用,在查找方面可以和XPath结合。
可以调整JVM大小(默认为64M)来预防内存不足。(编译器里修改VM arguments)

3)PULL

在J2ME对于节点处理比较好,类似SAX方式,都是基于事件的模式。同样很节省内存,在J2ME中经常使用KXML库来解析。

4)Dom和Sax解析方法区别

Dom解析的优点是对文档crud(增加Create、读取查询Retrieve、更新Update、删除Delete)方便,缺点是占用内存比较大。
Sax解析的优点是占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的crud。

4,AndroidManifest.xml

1)将Activity设置成窗口样式

在对应的Activity写:

android:theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Translucent"

2)configChanges

在对应Activity设置。
如果不设置对应Activity的android:configChanges,切屏会重新调用各个生命周期,切横竖屏各执行一次。

阻止程序在运行时重新加载Activity,除了设置”orientation”,你还必须设置”ScreenSize”。
fontScale:全局字体大小缩放发生改变。

android:configChanges="orientation|screenSize|fontScale|locale|touchscreen|navigation|screenLayout|smallestScreenSize|screenSize|mnc" >            

切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

android:configChanges="orientation|keyboardHidden"

3)permission

自定义权限permission

5,Android布局优化

1)思想

进来减少布局文件的层级。
(这样Android绘制时的工作量少了)

2)实现

①删除布局中无用的控件和层级

②有选择地使用性能较低的ViewGroup

如果LinearLayout和RelativeLayout二选一,选择LinearLayout。因为RelativeLayout功能比较复杂,布局需要话费更多的CPU时间。

LinearLayout和FrameLayout都是简单高效的ViewGroup。
如果需要通过嵌套的方式完成布局,则增加了布局的层级,用RelativeLayout更好。

③用<include>标签、<merge>标签、ViewStub

<include>用于布局重用,与<merge>搭配使用,可以降低布局的层级。
ViewStub提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存,提高了程序初始化的效率。

<include>用法

在要添加该include布局文件的xml中添加如下控件:

<include layout="@layout/titlebar"/>

注意:
这个标签只支持layout_开头的属性,android:layout_width,其他属性android:id都不支持。

<merge>用法

<include>一起使用,减少布局层级。
如当前布局是一个竖直方向的LinearLayout,这时如果<include>的布局文件也是竖直方向的LinearLayout,那么<include>中的LinearLayout是多余的,通过<merge>可去掉多余的一层LinearLayout。
include布局文件这样写:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/one"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/two"/>
</merge>

ViewStub用法

ViewStub继承了View,轻量级,宽高都是0,因此本身不参与任何的布局和绘制过程。
ViewStub的意义在于按需加载所需的布局文件,提高程序性能。
如:网络异常时,没有必要在整个界面初始化时将其加载进来。

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/layout_network_error"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"/>

–panel_import 是layout/layout_network_error这个布局的根元素的id。

按需加载:

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);

或者

View improtPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

注意:
当ViewStub通过setVisibility或者inflate方法加载后,ViewStub就被内部的布局替换。

猜你喜欢

转载自blog.csdn.net/sunshinetan/article/details/72638141