`
ipjmc
  • 浏览: 707995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android布局文件中命名空间的解析

阅读更多
    android 中View对象的创建可以在代码中创建,也可以在布局文件中声明,在布局文件中声明时,可以对在布局文件中添加属性,如:
android:layout_width="fill_parent"

    属性包括两个部分:android和layout_width,android是命名空间,layout_width是属性名,我们可以在View上添加任意不带前缀的属性如:
<View android:layout_width="44dip" android:layout_height="0dip" anyproperty="value" />

    上面的代码不会报任何的错误,但是这样做并没有任何的实际意义。
View中要想自己生命的属性有意义,则需要为属性加一个命名空间前缀,在布局文件中直接给View加前缀是不允许的,如:<Button myxmlns:anyproperty="value" /> 这样的代码在IDE中会直接报错,并提示无该命名空间,要想使得该命名空间有效,则需要在使用该命名空间之前生命该命名空间,方式如下:

<View xmlns:myxmlns="ssss" />

    有了如上的生命,我们就可以有如下的代码而使得IDE不会报告任何错误:
<View xmlns:myxmlns="sss" myxmlns:anyproperty="value" />

    在实际应用中大多数的自定义命名空间都声明在第一个元素中,如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myxmlns="ssss"    
android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView  
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/hello"
       ss="" />
    <View    myxmlns:sss="sss" />
</LinearLayout>

    但这些声明不会使得IDE报错,但其实也是没有任何意义的。因为这里的命名空间的值sss是任意定义的,我们要使得它看起来有意义,我们一般使用如下的值xmlns:myxmlns=""http://schemas.android.com/apk/res/<你的应用程序的包名>",同时我们还需要在values目录下创建一个attrs.xml的文件,文件的内容看起来像这样的:
<resources>
     <declare-styleable name="LabelView">
        <attr name="text" format="string" />
        <attr name="textColor" format="color" />
    </declare-styleable>
</resources>

这时如果你使用以下的布局文件IDE就会报错了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myxmlns="http://schemas.android.com/apk/res/com.zbkc.custumview"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView  android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/hello"    />
    <View myxmlns:sss="sss" />

</LinearLayout>


    他会在 <View myxmlns:sss="ssss" />这一行提示myxmlns的命名空间下sss这个属性,但我们可以使用如下的布局文件而不会报错:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myxmlns="http://schemas.android.com/apk/res/com.zbkc.custumview"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView  android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"   />
    <View myxmlns:text="sss" 
    myxmlns:textColor="#ffffffff"/>    
</LinearLayout>


    因为text和textColor属性在前面的布局文件中已经被声明。实际上给任何android自带的控件增加自定义属性都是无意义的做法,但对于自定义的View(继承自View的类)来增加自定义的属性却是有很大的实际意义的,如,我们可能经常看到有如下的声明:
<MyView android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    myxmlns:anyproperty="value" />

    这就是为自定义的View添加了额外的属性,但是刚有了我们前面的声明,并没有什么实际的意义,因为只是做到了声明IDE不报错,并没有任何实际的意义,我们现在要做的就是如何在自定义的View中(注意,只能在自定义的View中来取得这些值)取得我们在布局文件中声明的属性值。
    我们下面来写一个稍微完整一点的代码来演示一下完整的过程:
java代码

class LabelView extends View {
    private String text;
    private int textColor;

    public LabelView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LabelView);
        text = (String)a.getText(R.styleable.LabelView_text);
        textColor = a.getColor(R.styleable.LabelView_textColor, 0xff000000);
        Log.i("test", "text:" + text);
        Log.i("test", "textColor:" + textColor);
        a.recycle();
    }
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myxmlns="http://schemas.android.com/apk/res/com.zbkc.custumview"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    
    <com.zbkc.custumview.LabelView 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        myxmlns:text="sss"
        myxmlns:textColor="#ff00ff00" />    
</LinearLayout>

    我们另外再加一个入口代码就可以发现可以取得我们自定义声明的值了
转自:http://hi.baidu.com/xiaofanqing/blog/item/dd9c55fb62256677024f560b.html
分享到:
评论
2 楼 Jclick 2012-10-23  
1 楼 davidtps 2012-03-31  
 

相关推荐

    Android 解析xml文件

    在Android开发中,XML文件常用于存储数据、配置或布局信息。XML(eXtensible Markup Language)是一种结构化标记语言,易于阅读和编写,同时机器也能方便地解析和生成。本篇将深入探讨Android中解析XML文件的方法,...

    新浪微博布局文件

    1. **Android布局文件**:在Android开发中,布局文件位于项目的res/layout目录下,使用XML语言编写,描述了屏幕上控件的排列方式和交互逻辑。常见的布局类型有LinearLayout(线性布局)、RelativeLayout(相对布局)...

    Decor,android布局装饰器:在布局文件中注入自定义属性,使用装饰器消除带有自定义视图的不必要的类爆炸。.zip

    3. **XML布局中定义自定义属性**:在布局文件中,可以使用`app:`命名空间来定义自定义属性,这些属性对应于已注册的装饰器。 4. **运行时应用装饰器**:当布局被加载时,Decor会解析XML中的自定义属性,并调用相应的...

    Android-一个根据布局文件自动生成findViewById代码的androidstudio插件

    在Android应用开发中,`findViewById`是一个常见的任务,用于在Activity或Fragment中查找XML布局文件中的视图元素。然而,手动编写这样的代码既耗时又容易出错。为了解决这个问题,开发者通常会利用Android Studio的...

    Basic4Android布局开发工具

    **标题解析:**"Basic4Android布局开发工具" 在标题中提到的“Basic4Android”是一种基于Java语言的Android应用程序开发框架,它为开发者提供了一种更简单的编程方式,特别是对于那些不熟悉复杂的Java语法或者...

    XML布局文件

    在 XML 布局文件中,需要注意命名规则、根节点、ID 的指定、常用属性解析等问题。 XML 布局文件的命名及注意事项 在 XML 布局文件中,文件名必须以小写字母开头,且必须是 Java 变量名的命名规则。文件名不能包含...

    老罗android视频开发源码和ppt--android解析xml文件.rar

    XML文件因其结构化、易于解析和人类可读的特性,在Android系统中广泛用于布局文件、资源定义以及数据交换。本资料集合是"老罗"(罗升阳)关于Android视频开发的一系列教学资源,包括源码和PPT,专注于讲解如何在...

    Android中xml解析

    XML解析是将XML文档转换为程序可以理解的数据结构的过程,这对于Android应用程序的配置、布局和数据交换至关重要。本篇文章将深入探讨XML解析在Android中的应用,并特别关注XStream库的使用。 首先,Android提供了...

    android xml文件解码工具

    2. **XML命名空间(Namespace)**:在Android的XML文件中,常会看到像`xmlns:android="http://schemas.android.com/apk/res/android"`这样的声明,这是XML命名空间的使用,用于区分不同的属性和元素。 3. **Android...

    Android 中 tools 命名的使用案例

    在Android开发中,`tools`命名空间是一个非常重要的工具,它允许开发者在XML布局文件中添加一些临时或者调试相关的属性,这些属性并不会在运行时影响应用的行为,而是主要用于设计阶段或者IDE的辅助功能。...

    android mars视频代码 xml源码 XML解析

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于Android开发中,尤其是在处理配置文件、数据交换和布局设计等方面。Android Mars项目中的视频代码涉及到XML源码的解析,这对于我们理解XML在...

    Andrond xml文件解析器

    在Android开发中,XML文件广泛用于存储数据,如布局文件、配置文件等。"Andrond xml文件解析器"是一个针对Android平台的简单XML解析工具,它提供了三种不同的解析方法,便于开发者根据需求选择合适的方式读取和处理...

    解析Google Android SDK——智能手机开发范例手册-下载代码

    本文将基于书中的章节命名,如c3、c12等,来解析Android SDK的核心知识点。 首先,我们来看“c3”,这可能是关于Android SDK的基础环境搭建。在这一部分,开发者会学习如何安装和配置Android Studio,这是官方推荐...

    Android 中英文翻译

    在Android中,这些布局文件被视为资源,并通常被存放在项目的`res/layout`目录下。 每个XML文件都包含了一个组件和容器的层级结构,其中的XML元素代表不同的UI组件,而元素的属性则用于描述这些组件的外观和行为...

    Android自定义组件解析[郝留有]

    此外,正确处理命名空间的引用对于属性的识别至关重要,以确保自定义控件能够在布局文件中正确引用和应用。 自定义控件的设计与实现,不仅要求开发者深刻理解Android的UI架构和绘制流程,还需掌握如何有效利用GDI等...

    android开发之xml文件操作——SAX

    在Android开发中,XML文件操作是一项基础且重要的技能,特别是在布局设计、数据存储以及网络通信等方面。本项目以“SAX”为焦点,探讨如何在Android中使用SAX解析器处理XML文件。SAX(Simple API for XML)是一种...

    android根据layout文件生成activity及自动注册 Demo

    在Android中,布局文件定义了用户界面的元素和结构,比如TextView、Button等视图组件。解析这些文件,我们可以获取到每个视图的ID,进而可以为它们创建对应的Java代码,构建Activity的初始化逻辑。 例如,如果一个...

    Android命名规则

    在Android开发中,命名规则是提高代码可读性和维护性的重要规范。遵循良好的命名习惯能够帮助开发者更快地理解和定位代码,提升团队协作效率。以下是对Android命名规则的详细解释: 一、包名(packages): 包名...

    Android布局属性大全[文].pdf

    本文将详细解释Android布局中的常见属性,帮助开发者更好地理解和运用这些属性来优化UI设计。 首先,我们来看第一类属性,它们的值为`true`或`false`,主要用于对齐和居中: 1. `android:layout_centerHorizontal`...

    android Launcher2文件夾功能分析

    在Android操作系统中,Launcher是用户界面的核心组成部分,它扮演着桌面的角色,允许用户启动应用程序、创建快捷方式以及管理主屏幕上的图标布局。`Launcher2`是Android早期版本中默认的Launcher应用,尽管在后来的...

Global site tag (gtag.js) - Google Analytics