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
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就被内部的布局替换。