欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android一些不太常用XML文件属性的总结

来源: 开发者 投稿于  被查看 10778 次 评论:265

Android一些不太常用XML文件属性的总结


前言

最近做的项目中XML用到了一些平时可能不是太常用的一些属性,可能涉及都AndroidManifest.xml、布局Layout文件或者到具体的控件!

AndroidManifest.xml

在AndroidManifest.xml文件中标签中添加

其中的xxx.xxx.xxx为第三方库包名,如果存在多个库,则用逗号分割它们。这样做是为了项目中的AndroidManifest.xml和第三方库的AndroidManifest.xml合并时可以忽略最低版本限制。


是否允许备份应用的数据,默认是true,当备份数据的时候,它的数据会被备份下来。如果设为false,那么绝对不会备份应用的数据,即使是备份整个系统。


Android现在提供了一些API,使您可以构建更优雅的变换布局方向的用户界面。这些界面将支持由右到左(RTL)的语言和阅读方向。比如阿拉伯语和希伯来语。
为了使您的应用支持RTL布局,需要在manifest文件中设置元素的android:supportsRtl属性为“true”。一旦启用,该系统将启用各种RTL API来用RTL布局显示您的应用。
如果用了这个属性,有几个问题需要注意:
1. 要求最低SDK版本号为17。
2. 将左——右方向的布局属性转变为开始——结束方向的布局属性。


AS的Gradle插件默认会启用Manifest Merger Tool,若Library项目中也定义了与主项目相同的属性(例如默认生成的android:icon和android:theme),则此时会合并失败,并报错。
这时就需要你在manifest.xml中加入上面一句属性。

enabled属性表示是否这个service能被系统实例化。如果能则为true,否则为false。默认为true。元素有它自身的能应用到所有应用组件的enabled属性,包括services。要是这个service要enabled,那么这个属性都必须为true(它们都是默认值)。如果有一个为false,这个服务就会disabled;它就不会被实例化。
exported属性表示是否其它应用组件能调用这个service或同它交互,如果能则为true,否则为false。当值为false时,只有同一个应用的组件或有相同用户ID的应用能启动这个服务或绑定它。
默认值依赖于服务是否包含intent filters。过滤器的缺失意味着它只能通过指定它准确类名来调用它。这就意味着这个服务只能在应用内部被使用(因为其它应用不知道类名)。因此,在这种情况下,默认值是false。另一方面,至少有一个过滤器意味着这个服务可以在外部被使用,因此,默认值为true。

excludeFromRecents属性表示控制在不在recent列表中显示。true时不显示;false显示,默认。
tools:ignore=”ExportedActivity”表示允许所有的应用使用它。

⑦intent-filter下的data标签

<code class=" hljs xml"><data android:mimetype="*/*">
<data android:scheme="file">
<data android:host="*">
<data android:path="*">
<data android:pathprefix="*">
<data android:port="*">
<data android:pathpattern=".*..*..*..*..*.vpn"></data></data></data></data></data></data></data></code>

这个标签元素用于把数据规范添加到一个Intent过滤器中,数据规范能够只是数据类型(mimeType属性)、或数据位置标识(URI),也可以是数据类型和数据位置标识(URI)。一个URI(如下格式)被分成几个独立的属性来分别指定:
scheme://host:port/path or pathPrefix or pathPattern
这些属性是可选的,但也是相互依赖的。如果没有给Intent过滤器指定scheme属性,那么所有其他的URI属性都会被忽略。如果没有给过滤器指定host属性,那么port属性和所有的路径属性都会被忽略。
包含在同一个intent-filter元素中所有的data元素只会对这个过滤器起作用。

mimeType
多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions), 它的作用是告诉Android系统本Activity可以处理的文件的类型。
格式:[type]/[subtype]
type有下面的形式:

Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。

subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数,将随着时间而增长。为了确保这些值在一个有序而且公开的状态下开发,MIME使用Internet Assigned Numbers Authority (IANA)作为中心的注册机制来管理这些值。常用的subtype值如下所示:

text/plain(纯文本)
text/html(HTML文档)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
image/png(PNG图像)【PHP中为:image/x-png】
video/mpeg(MPEG动画)
application/octet-stream(任意的二进制数据)
application/pdf(PDF文档)
application/msword(Microsoft Word文件)
message/rfc822(RFC 822形式)
multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)

host
这个属性用户定义URI授权的主机部分,除非给过滤器也指定了元素的scheme属性,否则这个属性没有意义。
注意:在Android框架中,主机名的匹配是大小写敏感的,跟RFC格式不一样。因此,要始终使用小写字母来指定主机名。

path/pathPrefix/pathPattern
这个三个属性用于指定URI的路径部分。Path属性指定一个完整的路径,这个路径会跟Intent对象中的路径进行匹配。PathPrefix属性只指定了部分路径,它会跟Intent对象中的路径初始部分匹配。pathPattern属性指定一个要跟Intent对象中的路径进行匹配的完整路径,但是这个路径中可以包含下列通配符:
1. 星号*通配符,路径中的星号代表任意多个星号之前的那个字符,如a*,可跟a、aa、aaa、aaaa、…字符串匹配。
2. 点跟星号的组合.*通配符,它可以跟任意字符串进行匹配,如.*html,可以跟abchhtml、chtml、html、dssf.html、…等字符串匹配。

因为系统读取XML中的字符串时,会把’\’符号作为强制转义字符,因此就需要两次转义。例如,符号”*”要被写成”\\*”,符号’\’要被写成”\\\\”。这与Java代码中的写法基本相同。

port
这个属性用于定义URI授权的端口部分。只有给过滤器指定了scheme和host属性时,这个属性才有意义。

scheme
这个属性用于设定URI的scheme部分。它是给指定URI设置的最基本的属性,至少要给过滤器设置一个scheme属性,否则,其他的URI属性就没有意义了。
scheme属性值没有”:”符号结尾(如http,而不是http: )
如果过滤器有一个数据类型(设置了mimeType属性),但没有设置scheme属性,那么系统就会假定scheme是content:和file:
注意:在Android框架中,scheme的匹配时大小写敏感的,跟RFC格式不一样。因此,要始终使用小写字母来指定scheme。

标签
meta-data就像其名一样,主要用来定义一些组件相关的配置值。
按照官方定义,metadata是一组供父组件使用的名值对(name-value pair),因此相应的meta-data元素应该定义在相应的组件中。即如果想在activity中使用metadata,那么meta-data必须定义在AndroidManifest.xml的activity声明中。
使用:

然后在代码中得到我们的值:

//在Activity应用元素。
ActivityInfo info = this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");

//在application应用元素。
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
appInfo.metaData.getString("meta_name");

//在service应用元素。
ComponentName cn = new ComponentName(this,MetaDataService.class);
ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");

//在receiver应用元素。
ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");

layout.xml

①在布局或者控件中加入tools:context

tools:context="activity name"这一句不会被打包进APK。只是ADT的Layout Editor在你当前的Layout文件里面设置对应的渲染上下文,说明你当前的Layout所在的渲染上下文是activity name对应的那个activity,如果这个activity在manifest文件中设置了Theme,那么ADT的Layout Editor会根据这个Theme来渲染你当前的Layout。就是说如果你设置的MainActivity设置了一个Theme.Light(其他的也可以),那么你在可视化布局管理器里面看到的背景阿控件阿什么的就应该是Theme.Light的样子。仅用于给你看所见即所得的效果而已。

②抽象布局标签

使用抽象布局标签(include, viewstub, merge)主要是为了优化布局!、去除不必要的嵌套和View节点、减少不必要的infalte及其他Layout方面可调优点。

标签

include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化,这在布局编写方便提供了大大的便利。
用法:

include标签唯一需要的属性是layout属性,指定需要包含的布局文件。可以定义android:id和android:layout_*属性来覆盖被引入布局根节点的对应属性值。

标签

viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等。
用法:

其中network_error.xml为只有在网络错误时才需要显示的布局,默认不会被解析。
当我们要使用的时候,有两种方法可以使用,效果是一样的:

((ViewStub) findViewById(R.id.layout_error)).setVisibility(View.VISIBLE);  
// 或者 
View importPanel = ((ViewStub) findViewById(R.id.layout_error)).inflate();  

标签

在使用了include后可能导致布局嵌套过多,多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可通过hierarchy viewer或设置->开发者选项->显示布局边界查看。merge标签在UI的结构优化中起着非常重要的作用,它可以删减多余的层级,优化UI。
merge多用于替换FrameLayout或者当一个布局包含另一个时,merge标签消除视图层次结构中多余的视图组。

merge标签可用于两种典型情况:
a. 布局顶结点是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity内容视图的parent view就是个FrameLayout,所以可以用merge消除只剩一个。
b. 某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中。

用法:


  

        

 

控件

①TextView



android:textAppearance="?android:attr/XXXX"


android:ellipsize="start"

android:textStyle="bold"

②EditText

android:imeActionId="@+id/login"
android:imeActionLabel="@string/sign_in"
android:imeOptions="actionUnspecified"

这三个属性是对软键盘右下角的回车键的功能进行设置,然后在代码中重写onEditorAction()方法,参数中的actionId对应的就是imeOption属性中设置的值。


android:textCursorDrawable="@null"

用户评论