android 属性动画的R类里面都是些什么属性?...

理解Android中的自定义属性
作者:鸿洋_
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了理解Android中的自定义属性,在android相关应用开发过程中,固定的一些属性可能满足不了开发的需求,所以需要自定义控件与属性,本文将以此问题进行详细介绍,需要的朋友可以参考下
本文实例讲解了Android中的自定义属性,具体内容如下
对于自定义属性,大家肯定都不陌生,遵循以下几步,就可以实现:
自定义一个CustomView(extends View )类
编写values/attrs.xml,在其中编写styleable和item等标签元素
在布局文件中CustomView使用自定义的属性(注意namespace)
在CustomView的构造方法中通过TypedArray获取
ps:如果你对上述几个步骤不熟悉,建议先熟悉下,再继续~
那么,我有几个问题:
以上步骤是如何奏效的?
styleable 的含义是什么?可以不写嘛?我自定义属性,我声明属性就好了,为什么一定要写个styleable呢?
如果系统中已经有了语义比较明确的属性,我可以直接使用嘛?
构造方法中的有个参数叫做AttributeSet
(eg: MyTextView(Context context, AttributeSet attrs) )这个参数看名字就知道包含的是参数的数组,那么我能不能通过它去获取我的自定义属性呢?
TypedArray是什么鬼?从哪冒出来的,就要我去使用?
恩,针对这几个问题,大家可以考虑下,如何回答呢?还是说:老子会背上述4个步骤就够了~~
2、常见的例子
接下来通过例子来回答上述问题,问题的回答顺序不定~~大家先看一个常见的例子,即上述几个步骤的代码化。
自定义属性的声明文件
&?xml version="1.0" encoding="utf-8"?&
&resources&
&declare-styleable name="test"&
&attr name="text" format="string" /&
&attr name="testAttr" format="integer" /&
&/declare-styleable&
&/resources&
自定义View类
package com.example.
import android.content.C
import android.content.res.TypedA
import android.util.AttributeS
import android.util.L
import android.view.V
public class MyTextView extends View {
private static final String TAG = MyTextView.class.getSimpleName();
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.test);
String text = ta.getString(R.styleable.test_testAttr);
int textAttr = ta.getInteger(R.styleable.test_text, -1);
Log.e(TAG, "text = " + text + " , textAttr = " + textAttr);
ta.recycle();
布局文件中使用
&RelativeLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
xmlns:zhy="/apk/res/com.example.test"
android:layout_width="match_parent"
android:layout_height="match_parent" &
&com.example.test.MyTextView
android:layout_width="100dp"
android:layout_height="200dp"
zhy:testAttr="520"
zhy:text="helloworld" /&
&/RelativeLayout&
ok,大家花3s扫一下,运行结果为:
MyTextView: text = helloworld , textAttr = 520
应该都不意外吧,注意下,我的styleable的name写的是test,所以说这里并不要求一定是自定义View的名字。
3、AttributeSet与TypedArray
下面考虑:
构造方法中的有个参数叫做AttributeSet(eg: MyTextView(Context context, AttributeSet attrs) )这个参数看名字就知道包含的是参数的集合,那么我能不能通过它去获取我的自定义属性呢?
首先AttributeSet中的确保存的是该View声明的所有的属性,并且外面的确可以通过它去获取(自定义的)属性,怎么做呢?
其实看下AttributeSet的方法就明白了,下面看代码。
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
int count = attrs.getAttributeCount();
for (int i = 0; i & i++) {
String attrName = attrs.getAttributeName(i);
String attrVal = attrs.getAttributeValue(i);
Log.e(TAG, "attrName = " + attrName + " , attrVal = " + attrVal);
// ==&use typedarray ...
MyTextView(4136): attrName = layout_width , attrVal = 100.0dip
MyTextView(4136): attrName = layout_height , attrVal = 200.0dip
MyTextView(4136): attrName = text , attrVal = helloworld
MyTextView(4136): attrName = testAttr , attrVal = 520
结合上面的布局文件,你发现了什么?
我擦,果然很神奇,真的获得所有的属性,恩,没错,通过AttributeSet可以获得布局文件中定义的所有属性的key和value(还有一些方法,自己去尝试),那么是不是说TypedArray这个鬼可以抛弃了呢?***是:NO!。
现在关注下一个问题:
TypedArray是什么鬼?从哪冒出来的,就要我去使用?
我们简单修改下,布局文件中的MyTextView的属性。
&com.example.test.MyTextView
android:layout_width="@dimen/dp100"
android:layout_height="@dimen/dp200"
zhy:testAttr="520"
zhy:text="@string/hello_world" /&
现在再次运行的结果是:
MyTextView(4692): attrName = layout_width , attrVal = @
MyTextView(4692): attrName = layout_height , attrVal = @
MyTextView(4692): attrName = text , attrVal = @
MyTextView(4692): attrName = testAttr , attrVal = 520
&&use typedarray
MyTextView(4692): text = Hello world! , textAttr = 520
发现了什么?通过AttributeSet获取的值,如果是引用都变成了@+数字的字符串。你说,这玩意你能看懂么?那么你看看最后一行使用TypedArray获取的值,是不是瞬间明白了什么。
TypedArray其实是用来简化我们的工作的,比如上例,如果布局中的属性的值是引用类型(比如:@dimen/dp100),如果使用AttributeSet去获得最终的像素值,那么需要第一步拿到id,第二步再去解析id。而TypedArray正是帮我们简化了这个过程。
贴一下:如果通过AttributeSet获取最终的像素值的过程:
int widthDimensionId = attrs.getAttributeResourceValue(0, -1);
Log.e(TAG, "layout_width= "+getResources().getDimension(widthDimensionId));
ok,现在别人问你TypedArray存在的意义,你就可以告诉他了。
4、declare-styleable
我们已经解决了两个问题,接下来,我们看看布局文件,我们有一个属性叫做:zhy:text。
总所周知,系统提供了一个属性叫做:android:text,那么我觉得直接使用android:text更nice,这样的话,考虑问题:
如果系统中已经有了语义比较明确的属性,我可以直接使用嘛?
***是可以的,怎么做呢?
直接在attrs.xml中使用android:text属性。
&declare-styleable name="test"&
&attr name="android:text" /&
&attr name="testAttr" format="integer" /&
&/declare-styleable&
注意,这里我们是使用已经定义好的属性,不需要去添加format属性(注意声明和使用的区别,差别就是有没有format)。
然后在类中这么获取:ta.getString(R.styleable.test_android_text);布局文件中直接android:text="@string/hello_world"即可。
这里提一下,系统中定义的属性,其实和我们自定义属性的方式类似,你可以在sdk/platforms/android-xx/data/res/values该目录下看到系统中定义的属性。然后你可以在系统提供的View(eg:TextView)的构造方法中发现TypedArray获取属性的代码(自己去看一下)。
ok,接下来,我在想,既然declare-styleable这个标签的name都能随便写,这么随意的话,那么考虑问题:
styleable 的含义是什么?可以不写嘛?我自定义属性,我声明属性就好了,为什么一定要写个styleable呢?
其实的确是可以不写的,怎么做呢?
首先删除declare-styleable的标签
那么现在的attrs.xml为:
&?xml version="1.0" encoding="utf-8"?&
&resources&
&attr name="testAttr" format="integer" /&
&/resources&
* MyTextView实现
package com.example.
import android.content.C
import android.content.res.TypedA
import android.util.AttributeS
import android.util.L
import android.view.V
public class MyTextView extends View {
private static final String TAG = MyTextView.class.getSimpleName();
private static final int[] mAttr = { android.R.attr.text, R.attr.testAttr };
private static final int ATTR_ANDROID_TEXT = 0;
private static final int ATTR_TESTATTR = 1;
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// ==&use typedarray
TypedArray ta = context.obtainStyledAttributes(attrs, mAttr);
String text = ta.getString(ATTR_ANDROID_TEXT);
int textAttr = ta.getInteger(ATTR_TESTATTR, -1);
//输出 text = Hello world! , textAttr = 520
Log.e(TAG, "text = " + text + " , textAttr = " + textAttr);
ta.recycle();
貌似多了些代码,可以看到我们声明了一个int数组,数组中的元素就是我们想要获取的attr的id。并且我们根据元素的在数组中的位置,定义了一些整形的常量代表其下标,然后通过TypedArray进行获取。
可以看到,我们原本的:
R.styleable.test =& mAttr
R.styleable.test_text =& ATTR_ANDROID_TEXT(0)
R.styleable.test_testAttr =& ATTR_TESTATTR(1)
那么其实呢?android在其内部也会这么做,按照传统的写法,它会在R.java生成如下代码:
public static final class attr {
public static final int testAttr=0x7f0100a9;
public static final class styleable {
public static final int test_android_text = 0;
public static final int test_testAttr = 1;
public static final int[] test = {
0x0101014f, 0x7f0100a9
ok,根据上述你应该发现了什么。styleale的出现系统可以为我们完成很多常量(int[]数组,下标常量)等的编写,简化我们的开发工作(想想如果一堆属性,自己编写常量,你得写成什么样的代码)。那么大家肯定还知道declare-styleable的name属性,一般情况下写的都是我们自定义View的类名。主要为了直观的表达,该declare-styleable的属性,都是改View所用的。
其实了解该原理是有用的,详见:Android 自定义控件 优雅实现元素间的分割线
ok,现在5个问题,回答了4个,第一个问题:
自定义属性的几个步骤是如何奏效的?
恩,上述以及基本涵盖了这个问题的***,大家自己总结,所以:略。
attrs.xml里面的declare-styleable以及item,android会根据其在R.java中生成一些常量方便我们使用(aapt干的),本质上,我们可以不声明declare-styleable仅仅声明所需的属性即可。
我们在View的构造方法中,可以通过AttributeSet去获得自定义属性的值,但是比较麻烦,而TypedArray可以很方便的便于我们去获取。
我们在自定义View的时候,可以使用系统已经定义的属性。
以上就是关于Android中的自定义属性的相关内容,希望对大家的学习有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Android清单文件详解(五)----&application&的属性详解
Android清单文件详解(五)----&application&的属性详解
[摘要:前里第三篇,第四篇专文固然讲授了application节面的几个属性,然则借不敷完整,本着对专业固执的精力,有需要深挖下往。
1.android:allowBackup
它透露表现是不是同意运用顺序]
前面第三篇,第四篇博文虽然讲解了application节点的几个属性,但是还不够完全,本着对专业执着的精神,有必要深挖下去。
1.android:allowBackup
它表示是否允许应用程序参与备份。如果将该属性设置为false,则即使备份整个系统,也不会执行这个应用程序的备份操作,而整个系统备份能导致所有应用程序数据通过ADB来保存。该属性必须是一个布尔值,或为true,或为false,其默认值为true。
现在,我们就对前面的HelloWorld实例进行修改。在工程的AndroidManifest.xml文件中添加allowBackup属性,并将其设置为false。该属性属于&application&节点,如下图所示的代码:
编译并***应用程序,完成后运行应用程序。
单击“myBackup”按钮,并执行adb shell bmgr run命令来执行一次备份操作,这样操作后看到的日志如下所示:
如上图所示,我们没有看到任何执行应用程序备份的日志输出,这说明android:allowBackup限制了备份的执行。
2.allowTaskReparenting
android:allowTaskReparenting是任务调整属性,它表明这个任务重新被送到前台的时候,该应用程序所定义的Activity是否可以从被启动的任务中转移到有相同亲和力的任务中。
这个属性的数据类型是布尔型,它的取值只有true和false两种。它不是必须指定的属性,如果我们没有显示指定这个属性,那么它将被指定为默认值false。
&application&和&activity&节点上都有这个属性可以配置。如果将该属性配置在&application&节点上,并且没有在&activity&节点上配置的情况下,&application&节点上的值将会应用到每一个&activity&节点上。反之,如果&activity&节点上配置了这个属性,则以&activity&节点上的值为准。
3.android:killAfterRestore
这个属性是指在一个完整的系统恢复操作之后应用程序是否被终止。单个应用程序的恢复操作不会引起应用程序的终止。完整的系统恢复操作一般仅在手机首次***时才会发生一次。第三方应用通常都不需要使用该属性。
该属性的默认值为true,意为在完整的系统恢复期间,应用程序在结束处理其数据之后将被终止。
4.android:restoreAnyVersion
它指是否允许恢复任意版本的备份数据来恢复应用程序的数据,即使备份明显来自于当前***在设备上的应用程序的更新版本。将该属性设置为true,则将允许备份管理器尝试恢复操作,有的时候版本不匹配表明数据是不兼容的,这个时候如果可以恢复到不同版本的数据,那么应用程序将承受很大的风险,所以请谨慎使用此属性
它必须是布尔值,或为true,或为false,默认值为false。
5.android:debuggable
这是一个布尔型标志,它的取值是true或false,这个标志指示应用程序在用户模式的设备上是否可以调试。如果为true,则表示应用程序可以被调试;如果为false,则表示应用程序不可以被调试。它的默认值是false。使用这个标志唯一需要注意的是,它只在用户模式的机器上生效,用户模式既是买着用的android手机,而虚拟机一般都是工程模式。
当你创建一个项目的时候,一般这个属性没有配置,但它有默认值,为false。
要发挥极客精神,就有必要对这个只是深挖,下面就来介绍这个标志是如何生效的。
首先,在***一个应用程序的APK到设备中时,包管理服务(PackageManagerService)会调用自己的解析器(PackageParser)去解析应用程序的&AndroidManifest.xml&文件,从而形成包信息。它的解析入口函数位于“/frameworks/base/core/java/android/content/pm/PackageParser.java”的parsePackage()方法中,该方法的关键代码如下所示:
public Package parsePackage(File source,String destCodePath,DisplayMetrics metrics,int false){
//打开AndroidManifest.xml文件
parser=assmgr.openXmlResourceParser(cookie,ANDROID_MANIFES_FILENAME);
//开始解析AndroidManifest.xml文件
pkg=parserPackage(res,parser,flags,errorText);
}catch(Exception e){
//返回包信息
这里pkg=parserPackage(res,parser,flags,errorText);;负责解析整个AndroidManifest.xml文件。由于android:debuggable是&application&节点的属性之一,这里将通过parseApplication()方法解析整个&application&节点,其中包括自身属性,&service&节点,&activity&节点等的处理。对于android:debuggable属性,它是这样处理的:
private boolean parseApplication(Package owner,Resources res,XmlPullParser parser,AttributeSet attrs,int flags,String[] outError)throws XmlPullParserException,IOException{
final ApplicationInfo ai=owner.applicationI
final String pkgName=owner.applicationInfo.packageN
if(sa.getBoolean(com.android.internal.R.sytleable.AndroidManifestApplication_debuggable,false)){
ai.flags|=ApplicationInfo.FLAG_DEBUGGABLE;
如果将android:debuggable设置为true,就将应用程序信息标志序列的第2位设置为1,这个标志对于应用程序的进程特征起了关键的作用。
最后,当我们试图启动这个应用程序时,这个标志序列中的一些位将转换为参数信息来帮助孵化出应用程序的进程。关键代码如下所示:
/dalvik/vm/native/dalvik_system_Zygote.cpp::enableDebugFeatures(u4 debugFlags)
static void enableDebugFeatures(u4 debugFlags){
#iifdef H***E_ANDROID_OS
IF((debugFlags & DEBUG_ENABLE_DEBUGGER)!=0){
if(prct1(PR_SET_DUMPABLE,1,0,0,0)&0){
其中prct1(PR_SET_DUMPABLE,1,0,0,0)设定了进程的可转储属性为1。这样设置之后,这个应用程序的进程就变为“可调试”状态了。
6.android:description
这个属性是描述应用程序的,它是一个用户只读的文本,比应用程序标签android:label的描述更长,更详细。但需要注意的是,这里必须配置为一个字符串资源的引用,不能像应用程序标签那样设置为一个字符串。它没有默认值。
首先,我们要知道为什么Android要给这个限制(这里必须配置为一个字符串资源的引用),下面对比一下Android对android:label和android:description属性的差异:
&attr name=&label& format=&reference|string&/&
&attr name=&description& format=&reference&/&
上面两行代码是对这两个属性的定义,其中label的format为reference|string,这表示它支持资源引用和字符串两种格式,而description的format仅为reference,这表示当配置android:description属性时,它只能是一个引用。
7.android:enabled
默认情况下,Android系统会自行实例化每一个应用程序的组件,包括Android四大组件,但如果我们需要自己完成这些事情的话,就需要使用android:enabled属性来限制Android系统的行为。这个属性表明Android系统是否可以被实例化应用程序组件,如果其值为true,则说明应用程序组件可以被Android系统自动实例化;如果为false,则说明实例化组件的工作需要手工完成。该属性的默认值为true。每一个组件都可以单独定义自己的enabled属性。如果这个属性定义在&application&节点中,那么它会默认将每个组件的enabled属性设置为相同的值。如果每一个组件单独定义了这个属性,那么&application&节点上定义的属性对此组件不再生效,就由自己的enabled属性决定。
8.android:hasCode
该属性表明应用程序是否含有代码,若其值为true,表示应用程序含有代码,false则表示其中没有代码。该属性的默认值是true。当其值是false时,加载组件时系统不会尝试加载任何应用程序的代码。应用程序一般没有它自己的任何代码,除非它仅是由组件类构建而成的,比如Activity使用AliasActivity类,但这很少发生。
hasCode作为一个标志,被集成到包信息的flags标志中,以此来作为操作应用程序的参数,示例代码如下所示:
if(sa.getBoolean(com.android.internal.R.sytleable.AndroidManifest
Application_hasCode,true)){
ai.flags|=ApplicationInfo.FLAG_HAS_CODE;
从以上代码片段可以看出,这个标志被合到ai.flags的第3位上。
9.android:hardwareAccelerated
android:hardwareAccelerated标志指示硬件加速渲染功能是否对应用程序中的所有Activity和View启用,如果启用,则为true,否则为false,其默认值是false。
从Android 3.0开始,硬件加速的OpenGL渲染器对所有应用程序都有效,这样做的目的是改善大多数2D图形操作的性能。当硬件加速渲染器被启用时,大多数操作(包括Canvas,Paint,Xfermode,ColorFilter,Shader和Camera)都会被加速,这样产生的结果是更顺滑的动画效果,更顺滑的滚动效果以及整体响应的改进。即使对于那些不能明确使用OpenGL库的应用程序,其结果也一样。
需要注意的是,不是所有的OpenGL操作都是被加速的。如果启用硬件加速渲染器,就要先测试应用程序以便确保它可以无误地使用渲染器。
对于Android框架来说,这个标志是这样被打包成信息的:
boolean hardwareAccelerated=sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_hardwareAccelerated,
owner.applicationInfo.targetSdkVersion&=Build.VERSION_CODES.ICE_CREAM_SANDWICH);
if(!receiver){
if(sa.getBoolean(com.android.internal.R.styleable.AndroidManifest
Activity_hardwareAccelerated,hardwareAccelerated)){
当没有设置这个标志的时候,它的默认值取决于是否配置了android:targetSdkVersion。如果没有配置,则Android默认将android:targetSdkVersion作为当前设备系统的SDK版本。当android:targetSdkVersion属性的值大于或者等于当前系统版本时,则启用硬件加速,反之则禁用硬件加速。
下面我们结合源代码路径/frameworks/base/core/java/androdi/app/Acti-vity.java,再来看看在Activity附加到窗口之前是如何使用这个标志的,代码如下所示:
final vodi attach(Context context,ActivityThread aThread,Instrumentation instr,IBinder token,int ident,
Application application,Intent intent,ActivityInfo info,CharSequence title,Activity parent,String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config){
mWindow.setWindowManager(null,mToken,mComponent,flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED)!=0)
建议: 如果不打算设置hardwareAccelerated标志,则尽量配置&uses-sdk&节点,代码如下所示:
&uses-sdk android:targetSdkVersion=&15&&
10.android:label / android:icon
android:label和android:icon这两个属性分别是有关标签和图标的。先来看看android:label,它是Android标签属性,是应用程序全局的一个用户可读的标签,也是该应用程序所有组件的默认标签。在项目生成的时候,就已经定义了该属性,它可以是一个字符串资源的引用,也可以是一个字符串。能这么做的原因是该标签是这样定义的:
&attr name=&label& format=&reference|string&&
此处,建议尽可以使用字符串资源的引用形式,因为这样可以更好地支持国际化特性。在应用程序标签被定义之后,它就会在诸如应用程序菜单,设置的应用程序信息等位置被使用,如下图的位置:
在上图,我们盾到红色方框部分就是设置该属性的效果图。
接下来,我们再来看看另一个属性android:icon,它是应用程序全局的一个图标,也是该应用程序所有组件的默认图标。这个属性在Android框架中是这样定义的:
&attr name=&icon& format=&reference&&
可以看到,这里只能配置图片资源的引用,例如@drawable/icon。当我们配置了这个属性之后,它就会在应用程序菜单,设置的应用程序列表以及设置的应用程序详情界面中显示出来,通俗的说,就是应用程序图标。
11.android:logo
android:logo属性用于配置应用程序的商标。自Android3.0以后,应用程序窗口多了一个标题栏,而应用程序的logo将会出现在那里。对于Android框架而言,它是这样定义这个属性的:
&attr name=&logo& format=&reference&&
这说明它能接受的只是一个图片资源的引用。配置这个属性后运行程序,会发现在启动的每一个界面上都会看到这个图标,如果同时设置了logo,icon,logo会覆盖掉icon的图标。
12.android:manageSpaceActivity
该属性是一个Activity子类的全名,用户使用它可以管理设备上该应用程序占有的内存。Activity也应该用&activity&元素声明。
13.android:permission
该属性是客户端与应用程序交互所必须拥有的许可名,它是给应用程序的所有组件设置许可的便捷方式,可以被组件各自的许可属性值所覆盖。
14.android:persistent
该属性用来表明应用程序是否应该在任何时候都保持运行状态,若为true,则表示应该,false则表示不应该,其默认值为false。通常,应用程序不应该设置本属性,而持续模式仅仅对于某些系统应用程序才有意义。
在实际应用中就存在这样的例子,例如***模块,它在系统启动的时候就处于运行状态,这样***状态发生变化时就会在系统产生相应的变化。如下面代码所示:
&application android:name=&PhoneApp&
android:persistent=&true&
android:label=&@string/phoneAppLabel&
android:icon=&@drawable/ic_launcher_phone&
&/applicaiton&
15.android:process
该属性是应用程序所有组件运行的进程名。每个组件都能够设置自己的进程属性,以此来覆盖原来的默认值。
该属性的默认值是当前的应用程序包名。当应用程序的第一个组件需要运行时,Android:就生成一个进程,所有的组件都将在该进程里运行。默认情况下,进程名与&manifest&元素里设置的包名相匹配。
该属性设置为一个与其他应用程序共享的进程名,就可以将两个应用程序的组件说运行在相同的进程里。能这样做的前提是仅在两个应用程序共享一个用户ID并且被赋予相同***时。
如果该属性里设置的名字以冒号开头(:),那么在需要的时候它将生成该应用程序的一个私有新进程。如果进程名以小写字母开头,则生成以该进程名命名的一个全局进程。全局进程可以用来与其他应用程序分享,以便降低资源消耗。
如果配置下面的代码到新建的项目ApplicationTest里面,代码如下:
android:process=&:jinggege&
会得到如下图所示的结果:
如上图所示,就是一个包名加上上面配置的属性。
16.android:taskAffinity
它是应用程序所有Activity都适用的任务亲和力,除了那些将不同任务亲和力设置在自身taskAffinity属性里的Activity。我们可以这样理解这个属性:该Activity更喜欢待在哪个任务中。
对于不同版本的Android SDK来说,框架对该属性的处理是不一样的。下面的代码说明了还同处理中出现的一些问题:
if(owner.applicationInfo.targetSdkVersion&=Build.VERSION_CODES.FROYO){
str=sa.getNonConfigurationString(com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity,0);
str=sa.getNonConfigurationString(com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
ai.taskAffinity=buildTaskAffinityName(ai.packageName,ai.packageName,str,outError);
对于Android 2.2(Froyo)以后的版本,如果没有设置这个属性,则会采用默认值0,而之前的版本则不会提供默认值。
17.android:theme
android:theme属性为应用程序定义了一个整体风格。当开发一个商业应用程序时,风格是要考虑的重要因素之一。因此,为了保证应用程序的所有界面保持一定的风格标准,要尽量使用这个属性为应用程序定义风格。
android:theme属性是一个可以覆盖的属性。当我们需要对某个界面做一些特殊的处理时,只需要在对应的节点配置此属性,就可以覆盖掉应用程序配置的整体风格了。
对于框架而言,该属性不是必须配置的。如果没有配置,Android则会认为它的值为0,即无资源,如下代码所示:
ai.theme=sa.getResourceId(com.android.internal.R.styleable.AndroidManifestApplication_theme,0);
如果在&application&的某个子节点上配置了这个属性,那么框架将会覆盖整体风格而使用子节点上配置的风格:
现在我们举例说明如何使用这个属性。例如,给&application&节点增加android:theme属性,它的值指向Animation.Dialog的风格。相关代码如下:
android:theme=&@android:style/Animation.Dialog&
需要注意的是,这里的@android:style表示此资源位于“android”的空间中,也就是SDK预定义的那些资源。
刚刚说到增加的theme属性指向Animation.Dialog风格,其中风格是这样定义的:
&style name=&Animation.Dialog&&
&item name=&&windowEnterAnimation&@anim/dialog_enter&/item&
&item name=&windowExitAnimation&&@anim/dialog_exit&/item&
这里规定了进入和推出的动画效果。
除了使用SDK提供的风格资源以外,我们还可以使用自定义的风格资源,那么如何配置自定义风格呢?,大家可以按照下面的操作步骤自己动手实现。
①定义自己的风格资源。在工程res/value/目录下新建你的application_style.xml文件。
②打开刚刚创建的文件,加入如下代码:
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
& & &style name=&myTheme&&
& & &/style&
&/resources&
18.android:uiOptions
该属性用于开启Activity UI附加的扩展导航栏。在配置这个属性时,可供选择的值必须是下表所示的两个值中的一个。
关闭扩展栏。如果没有配置android:uiOptions属性,此为默认值
splitActionBarWhenNarrow
当在横向空间受到限制时,比如当手机处于纵向模式,在屏幕底部添加一个状态栏来显示ActionBar中的动作项。只有少数的Action项会出现在动作栏中。操作栏将被分成顶部导航部分和用于动作项的底部栏。这就保证了有一个合理数量的空间可用。
需要说明的是,android:uiOption属性是自Android4.0以后才提供的。因此,在需要使用该属性的时候,孙弱保证使用Android4.0以后的SDK(API14)
下面举例说明如何使用这个属性。
①就拿刚刚新建的AppilcationTest项目来说,在Androidmanifest.xml中的&application&节点中加入如下代码:
android:uiOptions=&splitActionBarWhenNarrow&
②在工程的/res.menu目录下新建一个菜单配置文件my_menu_cfg.xml。在该文件中配置如下代码:
&menu xmlns:android=&/apk/res/android&&
&item android:id=&@+id/item1& android:title=&show_item1& android:showAsAction=&always|withText& android:icon=&@drawable/abc_ic_menu_copy_mtrl_am_alpha&&&/item&
&item android:id=&@+id/item2& android:title=&show_item2&&&/item&
&item android:id=&@+id/item3& android:title=&show_item3& android:showAsAction=&always|withText& android:icon=&@drawable/abc_ic_menu_selectall_mtrl_alpha&&&/item&
需要注意的是,我们把要显示为Action项的菜单项的android:showAsAction设置为always。
③新建一个Activity类,名为UIOptionActivity,实现onCreateOptionsMenu()方法加载my_menu_cfg.xml菜单布局,代码如下:
public class UIOptionActivity extends Activity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my_menu_cfg,menu);
return super.onCreateOptionsMenu(menu);
④编译运行项目,运行结果如下图。
可以发现,屏幕底部出现了状态栏。
这样刚刚配置的android:showAsAction的项目就显示出来了,剩余部分包含在框中的超出菜单里,单击它时才会显示出来。大家可以自行尝试一下去掉这个属性的效果。
在不需要操作栏的时候,只需要把andriod:uiOption设置为none或者onCreateOptionmenu()方法空实现。
19.android:vmSafeMode
此属性用于指示虚拟机是否在安全模式下运行,它是一个布尔值,当没有配置它的时候,其默认值为false。示例代码如下:
if(sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_vmsafeMode,false)){
ai.flags|=ApplicationInfo.FLAG_VM_SAFE_MODE;
20.android:largeHeap
此属性指示应用程序是否使用一个比较大的堆创建,它是一个布尔值,在没有配置的情况下,它的默认值是false,示例代码如下:
if(sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_largeHeap,false)){
ai.flags|=ApplicationInfo.FLAG_LARGE_HEAP;
至此,我们介绍完了&application&节点支持的所有节点的用法,代码实现,含义及用法。在开发应用程序的时候,开发者应该根据具体需求有选择的使用这些属性,以使应用程序更高效地运行。
要注意的是,作为应用程序的根节点,&application&节点必须包括在&manifest&节点中。而&application&节点本身还包括&activity&,&activity-alias&,&service&,&receiver&,&provider&和&uses-library&这几个节点。
感谢关注 Ithao123Android频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言
Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
IThao123周刊

参考资料

 

随机推荐