`
我爱3G
  • 浏览: 29994 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android 自定义View自定义属性的声明

阅读更多
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" />
<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声明

<?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>
我们另外再加一个入口代码就可以发现可以取得我们自定义声明的值了
分享到:
评论

相关推荐

    android 自定义view及自定义属性

    在Android开发中,自定义View和自定义属性是提升应用个性化和功能扩展性的重要手段。本文将深入探讨这两个核心概念,以及如何在实际项目中应用它们。 ### 自定义View 自定义View允许开发者创建自己的视图组件,以...

    android 自定义view比较综合的例子

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。这个“android 自定义view比较综合的例子”显然涵盖了多个高级话题,旨在帮助有一定基础的开发者提升自定义...

    BookPage-Android自定义View实现翻页效果,并附带实现教程.zip

    仿真书籍翻页效果BookPageView简介:实现了仿真翻页效果,教程完整地描述了翻页原理分析到性能优化的过程教程博客:Android自定义View——从零开始实现书籍翻页效果(一) Android自定义View——从零开始实现书籍...

    Android自定义View以及Layout属性

    在Android开发中,自定义View和Layout是提升应用性能、实现独特交互效果和优化界面设计的重要手段。本文将深入探讨自定义View和Layout的属性,以及如何通过源码理解和使用这些特性。 首先,自定义View的基本步骤...

    Android 自定义View实现水平温度计

    总的来说,这个项目涵盖了Android自定义View的基本流程,以及图形绘制、颜色处理、动态更新等核心知识点,是学习Android自定义组件的一个良好实践。通过学习和研究,开发者不仅可以掌握自定义View的开发技巧,还能...

    android 自定义View并添加属性

    本教程将深入探讨如何在Android中自定义View并为其添加属性,以实现更灵活的界面定制。 首先,自定义View通常涉及到继承一个现有的View类,如View、TextView或ImageView等,或者直接继承ViewGroup来创建自定义容器...

    Android 自定义View 之 自定义属性 demo 修改版

    本篇文章将深入探讨如何在Android中进行自定义View,并以"自定义属性demo修改版"为例,讲解如何添加和使用自定义属性。 首先,自定义属性是在Android资源文件中定义的,通常在res/values/attrs.xml中。在这个示例中...

    Android自定义View实现转盘旋转的效果

    Android 自定义 View 实现转盘旋转的效果 Android 的自定义 View 为开发者定义和使用个性化的 View 提供了很好的支持,想要使用自己定义的 View,需要继承 View 类,并重写构造函数和 onDraw() 函数。onDraw 函数...

    Android自定义View图片裁剪,支持自由裁剪、按自定义比例裁剪、圆形裁剪、旋转、镜面翻转,从0到1自定义View

    方便调用,有示例。 Android自定义View图片裁剪,支持自由裁剪、按自定义比例裁剪、圆形裁剪、旋转、镜面翻转,从0到1自定义View。kotlin编写的一个自定义View。

    Android 自定义View视图

    在Android应用开发中,自定义View视图是一个重要的技术,它允许开发者根据特定需求创建独一无二的用户界面元素。本文将深入探讨如何通过继承View类来实现一个自定义的罗盘界面,以帮助开发者理解自定义视图的工作...

    Android 自定义view,自定义属性demo

    本示例"Android 自定义view,自定义属性demo"将带你深入理解如何在Android中创建并使用自定义属性,以增强自定义View的功能。 首先,自定义属性是在XML布局文件中定义的,通常位于res/values目录下的attrs.xml文件...

    android 自定义View界面大合集

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。"Android 自定义View界面大合集"的主题涵盖了这个领域的广泛知识点,包括但不限于...

    Android自定义View实例:深度剖析 水晶/水滴 波浪球 实现步骤详解

    在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的UI元素,提升用户体验。本文将深度剖析如何实现一个名为“水晶/水滴 波浪球”的自定义View,并通过详细步骤讲解,帮助你掌握...

    Android 自定义view模板并实现点击事件的回调

    总结来说,创建Android自定义View模板并实现点击事件的回调,主要包括以下步骤: 1. 定义XML资源文件(如attrs.xml),声明自定义属性。 2. 创建自定义View类,继承自适当的父View类,如`RelativeLayout`。 3. 在...

    Android高手进阶之自定义View,自定义属性(带进度的圆形进度条)源码

    总结,自定义View与自定义属性是Android开发中的强大工具,它们能帮助开发者构建具有独特视觉效果和功能的组件。通过学习和实践如何创建一个带进度指示的圆形进度条,你可以提升自己的Android开发技能,并为你的应用...

    Android自定义View高仿抖音潜艇大挑战小游戏.zip

    Android自定义View高仿抖音潜艇大挑战小游戏.zipAndroid自定义View高仿抖音潜艇大挑战小游戏.zipAndroid自定义View高仿抖音潜艇大挑战小游戏.zipAndroid自定义View高仿抖音潜艇大挑战小游戏.zipAndroid自定义View...

    25. Android自定义View以及layout属性全攻略.txt

    Android自定义View以及layout属性全攻略.txt

    android 自定义View 两种方式

    对于复杂或需要重复使用的自定义View,通过XML布局文件进行声明是更常见且推荐的做法。首先,同样需要创建一个自定义View类并实现所需功能。然后,在XML布局文件中定义这个自定义View,使用`...

    android自定义View(五)打造自己的遥控器菜单

    这个过程涉及到了Android自定义View的基本原理,包括绘图、触摸事件处理、动画和布局管理等。了解并掌握这些知识,对于提升Android应用的用户体验具有重要意义。想要了解更多关于Android自定义View的内容,可以访问...

    AttributeSet自定义View属性获取

    `AttributeSet`是Android系统提供的一种机制,用于在布局XML中为自定义View指定特定的属性,并在运行时解析这些属性,以便自定义View根据这些属性进行初始化。本篇文章将深入探讨如何通过`AttributeSet`来实现自定义...

Global site tag (gtag.js) - Google Analytics