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

来源:互联网 发布:淘宝店铺店标素材 编辑:程序博客网 时间:2024/05/19 13:14

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

2,语法

1)布局

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

LinearLayout

RelativeLayout

FrameLayout

TableLayout

是LinearLayout子类。

2)xml解析

①SAX(Simple SPI for XML)

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

优点:不占内存空间、解析属性方便。(不用事先调入整个文档,占用资源少)。
缺点:对于嵌套多个分支来说处理不方便。

SAX工作原理:对文档进行顺序扫描,当扫描到文档开始与结束、元素开始与结束、文档结束等地方时通知事件处理函数,由事件处理函数做相应动作 ,然后继续同样的扫描,直至文档结束。
SAX是一种基于事件的解析器,事件驱动的流式解析方式:从文件开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,主要围绕事件源以及事件处理器来工作。当事件源产生事件后,调用事件处理器相应的方法,一个事件就可以得到处理。再事件源调用事件处理器特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能根据提供的事件信息来觉得自己的行为。
SAX是单向的

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

PC开发使用较多。
把整个XML文件加载到内存中去。
如果数据量不是很大,推荐使用,在查找方面可以和XPath结合。

这些对象组成一个树形结构:
对于整个XML文档来说,是一个Document对象。
每一个标签为一个Element对象。
文本变成一个Text对象。
属性变成Attr对象。

可以调整JVM大小(默认为64M)来预防内存不足。(编译器里修改VM arguments)

③PULL

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

④Dom和Sax解析方法区别

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

3,控件属性

1)距离单位

①dp(dip,设备独立像素)

与设备硬件有关,不同设备有不同的显示效果。
一般为了支持WVGA、HVGA、QVGA,使用dp可以不依赖于像素。

②px(pixels,像素)

不同设备显示效果相同。

③sp(scaled pixels,放大像素)

注意用于字体显示。设置字体必须使用sp。
1pt约等于2.22sp.

④pt(point)

是一个标准的长度单位,用于印刷业。1pt=1/72英寸。

2)button等没有背景或者RadioButton去掉默认样式的小圆点

 android:background="@null"

3)hint相关

android:hint="搜索"android:textColorHint="#03A9F4"

4)EditText

TextView是EditText父类。

4,AndroidManifest.xml

1)软键盘设置

界面对应的activity里加入

android:windowSoftInputMode="adjustPan"   键盘就会覆盖屏幕android:windowSoftInputMode="stateVisible|adjustResize"   屏幕整体上移

2)将Activity设置成窗口样式

在对应的Activity写:

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

3)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"

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

阅读全文
0 0
原创粉丝点击