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

前言

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

AndroidManifest.xml

在AndroidManifest.xml文件里标签中增加
<uses-sdk tools:overrideLibrary="xxx.xxx.aaa, xxx.xxx.bbb"/>
当中的xxx.xxx.xxx为第三方库包名,假设存在多个库,则用逗号切割它们。这样做是为了项目中的AndroidManifest.xml和第三方库的AndroidManifest.xml合并时能够忽略最低版本号限制。

<application android:allowBackup="false">
是否同意备份应用的数据,默认是true,当备份数据的时候。它的数据会被备份下来。假设设为false。那么绝对不会备份应用的数据,即使是备份整个系统。

<application android:supportsRtl="true">
Android如今提供了一些API。使您能够构建更优雅的变换布局方向的用户界面。这些界面将支持由右到左(RTL)的语言和阅读方向。

比方阿拉伯语和希伯来语。


为了使您的应用支持RTL布局,须要在manifest文件里设置元素的android:supportsRtl属性为“true”。一旦启用。该系统将启用各种RTL API来用RTL布局显示您的应用。
假设用了这个属性,有几个问题须要注意:
1. 要求最低SDK版本号号为17。
2. 将左——右方向的布局属性转变为開始——结束方向的布局属性。

<application tools:replace="android:icon,android:label,android:name">
AS的Gradle插件默认会启用Manifest Merger Tool。若Library项目中也定义了与主项目同样的属性(比如默认生成的android:icon和android:theme),则此时会合并失败,并报错。
这时就须要你在manifest.xml中增加上面一句属性。

<service
    android:enabled="true"
    android:exported="true" />

enabled属性表示是否这个service能被系统实例化。假设能则为true,否则为false。默觉得true。<application>元素有它自身的能应用到全部应用组件的enabled属性,包括services。要是这个service要enabled。那么这个<application><service>属性都必须为true(它们都是默认值)。假设有一个为false,这个服务就会disabled;它就不会被实例化。


exported属性表示是否其它应用组件能调用这个service或同它交互,假设能则为true。否则为false。当值为false时,仅仅有同一个应用的组件或有同样用户ID的应用能启动这个服务或绑定它。


默认值依赖于服务是否包括intent filters。过滤器的缺失意味着它仅仅能通过指定它准确类名来调用它。这就意味着这个服务仅仅能在应用内部被使用(由于其它应用不知道类名)。因此,在这样的情况下,默认值是false。还有一方面,至少有一个过滤器意味着这个服务能够在外部被使用。因此,默认值为true。

<activity
     android:excludeFromRecents="true"
     tools:ignore="ExportedActivity">

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

⑦intent-filter下的data标签

<data android:mimeType="*/*" />
<data android:scheme="file" />
<data android:host="*" />
<data android:path="*"/>
<data android:pathPrefix="*"/>
<data android:port="*"/>
<data android:pathPattern=".*..*..*..*..*.vpn" />

这个标签元素用于把数据规范增加到一个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授权的主机部分。除非给过滤器也指定了<data>元素的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/>标签
meta-data就像其名一样,主要用来定义一些组件相关的配置值。
依照官方定义,metadata是一组供父组件使用的名值对(name-value pair),因此相应的meta-data元素应该定义在相应的组件中。即假设想在activity中使用metadata。那么meta-data必须定义在AndroidManifest.xml的activity声明中。
使用:

<meta-data
    android:name="com.yt.key"
    android:value="@string/value" />

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

//在Activity应用<meta-data>元素。

ActivityInfo info = this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA); info.metaData.getString("meta_name"); //在application应用<meta-data>元素。 ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA); appInfo.metaData.getString("meta_name"); //在service应用<meta-data>元素。 ComponentName cn = new ComponentName(this,MetaDataService.class); ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA); info.metaData.getString("meta_name"); //在receiver应用<meta-data>元素。 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

<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"
    tools:context=".MainActivity">

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/>标签

include标签经常使用于将布局中的公共部分提取出来供其它layout共用。以实现布局模块化,这在布局编写方便提供了大大的便利。
使用方法:
<include layout="@layout/title.xml" />
include标签唯一须要的属性是layout属性。指定须要包括的布局文件。能够定义android:id和android:layout_*属性来覆盖被引入布局根节点的相应属性值。

<viewstub/>标签

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


使用方法:

<ViewStub
        android:id="@+id/layout_error"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout="@layout/network_error" />

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

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

<merge/>标签

在使用了include后可能导致布局嵌套过多。多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可通过hierarchy viewer或设置->开发人员选项->显示布局边界查看。merge标签在UI的结构优化中起着很关键的数据,它能够删减多余的层级,优化UI。


merge多用于替换FrameLayout或者当一个布局包括还有一个时,merge标签消除视图层次结构中多余的视图组。

merge标签可用于两种典型情况:
a. 布局顶结点是FrameLayout且不须要设置background或padding等属性,能够用merge取代。由于Activity内容视图的parent view就是个FrameLayout,所以能够用merge消除仅仅剩一个。


b. 某布局作为子布局被其它布局include时,使用merge当作该布局的顶节点。这样在被引入时顶结点会自己主动被忽略,而将其子节点全部合并到主布局中。

使用方法:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">  

    <!--详细的布局内容-->    

</merge> 

控件

①TextView

<!--设置文字的外观。这里引用的是系统自带的一个外观,?表示系统是否有这样的外观,否则使用默认的外观-->

android:textAppearance="?android:attr/XXXX"
<!--设置文字过长时,该怎样显示,"start"—–省略号显示在开头;
"end"——省略号显示在结尾;"middle"—-省略号显示在中间;
"marquee" ——以跑马灯 的方式显示(动画 横向移动)-->

android:ellipsize="start"
<!--设置字形,如bold粗体,italic倾斜-->
android:textStyle="bold"

②EditText

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

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

<!--设置EditText光标的颜色,假设为@null,则设置成与文字颜色一样-->
android:textCursorDrawable="@null"

③ListView

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

<!--when listview has no data,show the below layout. because set android:id/empty-->
<LinearLayout
    android:id="@android:id/empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ProgressBar
        android:layout_width="wrap_content"                              android:layout_height="wrap_content"                             style="?android:attr/progressBarStyleLarge"/>
     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Loading the profile,please wait"/>
</LinearLayout>

假设继承ListActivity。当你在listview下加了一个布局,且设置android:id="@android:id/empty",则该布局仅仅会在listview没有数据的时候显示。!。

posted on 2017-08-20 11:03  wgwyanfs  阅读(439)  评论(0编辑  收藏  举报

导航