android 自定义view的xml属性,attrs.xml汇总

转载请注明出处:http://blog.csdn.net/owysaibb/article/details/28435523

对于自定义的组件,我们不仅可以利用view自带的xml属性进行布局控制还可以通过自定义xml属性的方式实现对view的控制.下面就通过我自己的一个小demo给大家演示一下具体的操作流程.大神请移步!!!

本文中的xml属性续 switch button android仿iso7扁平开关按钮详情请移步。

原理解析:

我们一般写xml属性时一般都是android:****的格式,其中的android是命名空间,关于什么是命名空间,这不是本文讨论的范围。一般来说,在xml文件的根部我们都会加上 xmlns:android="http://schemas.android.com/apk/res/android",这其实是android定义好的命名空间。

自定义view的xml属性

当然我也可以使用自己定义的xml属性,下面我们来定义一些属性,这时候我就需要在android工程目录下的res/values/下新建一个attrs.xml文件,

内如如下

 

  1. </pre><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="sliding_switch">  
  4.         <attr name="backgroundOn" format="color"/>  
  5.         <attr name="backgroundOff" format="color"/>  
  6.         <attr name="space" format="dimension"/>  
  7.         <attr name="slideColor" format="color"/>  
  8.         <attr name="isCheck" format="boolean"/>  
  9.         <attr name="width">  
  10.             <enum name="wrap_content" value="1"/>  
  11.             <enum name="fill_parent" value="2"/>  
  12.         </attr>  
  13.         <attr name="height">  
  14.             <enum name="wrap_content" value="1"/>  
  15.             <enum name="fill_parent" value="2"/>  
  16.         </attr>  
  17.     </declare-styleable>  
  18. </resources>  
</pre><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="sliding_switch">
        <attr name="backgroundOn" format="color"/>
        <attr name="backgroundOff" format="color"/>
        <attr name="space" format="dimension"/>
        <attr name="slideColor" format="color"/>
        <attr name="isCheck" format="boolean"/>
        <attr name="width">
            <enum name="wrap_content" value="1"/>
            <enum name="fill_parent" value="2"/>
        </attr>
        <attr name="height">
            <enum name="wrap_content" value="1"/>
            <enum name="fill_parent" value="2"/>
        </attr>
    </declare-styleable>
</resources>


这个时候一个自定义的view属性文件就定义好了,接下来就是怎么去用这些属性,上面xml代码中的format部分是xml属性的有效值,那么这些属性的有效值有那些呢,通常情况下有color integer string reference dimension这些基本的类型,分别代表颜色,整型 字符串 图片资源id,尺寸资源id.想要了解更多的同学请看下边。

 

  1. <attr name = "background" format = "reference" /> reference:参考某一资源ID。例如:android:background = "@drawable/图片ID"  
  2. <attr name = "textColor" format = "color" /> color:颜色值。例如:android:textColor = "#00FF00"  
  3. <attr name = "focusable" format = "boolean" />  
  4. <attr name = "layout_width" format = "dimension" />  
  5. <attr name = "fromAlpha" format = "float" />  
  6. <attr name = "frameDuration" format="integer" />  
  7. <attr name = "apiKey" format = "string" />  
  8. <attr name = "pivotX" format = "fraction" /> fraction:百分数。  
<attr name = "background" format = "reference" /> reference:参考某一资源ID。例如:android:background = "@drawable/图片ID"
<attr name = "textColor" format = "color" /> color:颜色值。例如:android:textColor = "#00FF00"
<attr name = "focusable" format = "boolean" />
<attr name = "layout_width" format = "dimension" />
<attr name = "fromAlpha" format = "float" />
<attr name = "frameDuration" format="integer" />
<attr name = "apiKey" format = "string" />
<attr name = "pivotX" format = "fraction" /> fraction:百分数。
  1. enum:枚举值。  
  2. <attr name="orientation">  
  3.    <enum name="horizontal" value="0" />  
  4.     <enum name="vertical" value="1" />  
  5. </attr>     
enum:枚举值。
<attr name="orientation">
   <enum name="horizontal" value="0" />
    <enum name="vertical" value="1" />
</attr>   
  1. flag:位或运算。  
  2. <attr name="windowSoftInputMode">  
  3.    <flag name = "stateUnspecified" value = "0" />  
  4.    <flag name = "stateUnchanged" value = "1" />  
  5.    <flag name = "stateHidden" value = "2" />  
  6.    <flag name = "stateAlwaysHidden" value = "3" />  
  7.    <flag name = "stateVisible" value = "4" />  
  8.    <flag name = "stateAlwaysVisible" value = "5" />  
  9.    <flag name = "adjustUnspecified" value = "0x00" />  
  10.    <flag name = "adjustResize" value = "0x10" />  
  11.    <flag name = "adjustPan" value = "0x20" />  
  12.    <flag name = "adjustNothing" value = "0x30" />  
  13. </attr>    
flag:位或运算。
<attr name="windowSoftInputMode">
   <flag name = "stateUnspecified" value = "0" />
   <flag name = "stateUnchanged" value = "1" />
   <flag name = "stateHidden" value = "2" />
   <flag name = "stateAlwaysHidden" value = "3" />
   <flag name = "stateVisible" value = "4" />
   <flag name = "stateAlwaysVisible" value = "5" />
   <flag name = "adjustUnspecified" value = "0x00" />
   <flag name = "adjustResize" value = "0x10" />
   <flag name = "adjustPan" value = "0x20" />
   <flag name = "adjustNothing" value = "0x30" />
</attr>  

 

特别要注意:属性定义时可以指定多种类型值。例如:
  1. <attr name = "background" format = "reference|color" />   
<attr name = "background" format = "reference|color" /> 
使用:
  1. <attr name = "background" format = "reference|color" />   
<attr name = "background" format = "reference|color" /> 

在xml中使用xml自定义属性

 

我们需要在xml布局文件的根节点定义一个命名空间,关于什么是xml命名空间请自行百度吧.

这是程序当中使用的命名空间,其中res/后是你自定义view java文件的包名

 

  1. xmlns:app="http://schemas.android.com/apk/res/open.witype.slidingbutton"  
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <open.witype.slidingSwitch.SlidingButton   
  2.         android:id="@+id/switch_b"  
  3.         app:backgroundOn="@color/withe"  
  4.         android:layout_width="wrap_content"  
  5.         android:layout_height="wrap_content" />  
 
一般情况下,你只要在xml中申明了对应的命名空间,可以通过和使用android命名空间一样,直接能提示出attrs中的属性,如果没有提示也不要担心,用手写上去也是不会报错的,

 

 

在view中接收xml属性

在你自己的view中你必须实现view的构造方法

 

  1. public SlidingButton(Context context, AttributeSet attrs) {  
  2.         super(context, attrs);  
  3.         // TODO Auto-generated constructor stub  
  4.         TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.sliding_switch);  
  5.         int c_color = ta.getColor(R.styleable.sliding_switch_slideColor,Color.rgb(255, 255, 255));  
  6.         int t_color = ta.getColor(R.styleable.sliding_switch_backgroundOn,Color.rgb(98, 195, 208));  
  7.         int f_color = ta.getColor(R.styleable.sliding_switch_backgroundOff, Color.rgb(220, 220, 220));  
  8.     }  
 
整个流程就是这样.

 

posted @ 2014-11-17 01:03  MMLoveMeMM  阅读(476)  评论(0)    收藏  举报