在前面的文章中,已经实现了“设置中心”第一栏的功能以及布局

Android手机卫士(十七):自定义属性

  自定义属性声明

  接下来实现其他栏的布局和功能,由于它们之间的功能和布局类似,只是属性名称不同。所以本文在自定义控件的基础上实现自定义属性

  首先参考标准控件的源码,这里选择TextView

  源码路径为:D:\adt-bundle-windows-x86_64_20140101\sdk\platforms\android-18\data\res\values

  打开本文件夹下的attrs.xml文件,找到下面的代码:

XML/HTML代码
  1. <declare-styleable name="TextView">  
  2. <!-- Determines the minimum type that getText() will return.  
  3.      The default is "normal".  
  4.      Note that EditText and LogTextBox always return Editable,  
  5.      even if you specify something less powerful here. -->  
  6. <attr name="bufferType">  
  7.     <!-- Can return any CharSequence, possibly a  
  8.      Spanned one if the source text was Spanned. -->  
  9.     <enum name="normal" value="0" />  
  10.     <!-- Can only return Spannable. -->  
  11.     <enum name="spannable" value="1" />  
  12.     <!-- Can only return Spannable and Editable. -->  
  13.     <enum name="editable" value="2" />  
  14. </attr>  
  15. <!-- Text to display. -->  
  16. <attr name="text" format="string" localization="suggested" />  
  17. <!-- Hint text to display when the text is empty. -->  
  18. <attr name="hint" format="string" />  

  于是我们也可以模仿关键节点,写出自定义属性,工程res\values文件夹下新建attrs.xml文件,添加代码如下:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="com.wuyudong.mobilesafe.view.SettingItemView">  
  4.         <attr name="destitle" format="string"/>  
  5.         <attr name="desoff" format="string"/>  
  6.         <attr name="deson" format="string"/>  
  7.     </declare-styleable>  
  8. </resources>  

  构造方法中获取自定义属性值

  接下来定义命名空间,也是参考android标准来写

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3. ……  

  mobilesafe替换掉原有android

  com.wuyudong.mobilesafe必须这样编写,替换掉了android,代表当前应用自定义属性

  xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"

  修改后的代码如下:

XML/HTML代码
  1. <com.wuyudong.mobilesafe.view.SettingItemView  
  2.     xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  3.     android:id="@+id/siv_update"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="wrap_content"  
  6.     mobilesafe:destitle="自动更新设置"  
  7.     mobilesafe:desoff="自动更新已关闭"  
  8.     mobilesafe:deson="自动更新已开启" >  
  9. </com.wuyudong.mobilesafe.view.SettingItemView>  

  自定义属性值已经搞定,现在是SettingItemView类如何获取这些值?

  在SettingItemView类的构造函数中调用initAttrs函数,然后通过initAttrs函数实现属性的返回。先通过一些小的实践来熟悉相关的API

Java代码
  1. /** 
  2.  * 返回属性集合中自定义属性的属性值 
  3.  * @param attrs  构造方法中维护好的属性集合 
  4.  */  
  5. private void initAttrs(AttributeSet attrs) {  
  6.     //获取属性的总个数  
  7.     Log.i(tag,"attrs.getAttributeCount(): " + attrs.getAttributeCount());  
  8.     //获取属性名称以及属性值  
  9.     for (int i = 0; i < attrs.getAttributeCount(); i++) {  
  10.         Log.i(tag, "name = " + attrs.getAttributeName(i));  
  11.         Log.i(tag, "value = " + attrs.getAttributeValue(i));  
  12.         Log.i(tag, "==================分割线======================");  
  13.     }  
  14. }

  运行项目后在Logcat中打印下面的日志信息:

Android手机卫士(十七):自定义属性

  解释一下上面的部分代码:

  value = @2131427413对应的十六进制值为:7F0B0055,其实就是对应的R文件中

Java代码
  1. public static final int siv_update=0x7f0b0055;  

  其他的都很简单

  接着我们使用其他的API来进行获取属性的值

Java代码
  1. private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.wuyudong.mobilesafe";  
  2. .......  
  3.   
  4. /** 
  5.  * 返回属性集合中自定义属性的属性值 
  6.  * @param attrs  构造方法中维护好的属性集合 
  7.  */  
  8. private void initAttrs(AttributeSet attrs) {  
  9.  /*   //获取属性的总个数 
  10.     Log.i(tag,"attrs.getAttributeCount(): "+attrs.getAttributeCount()); 
  11.     //获取属性名称以及属性值 
  12.     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
  13.         Log.i(tag, "name = " + attrs.getAttributeName(i)); 
  14.         Log.i(tag, "value = " + attrs.getAttributeValue(i)); 
  15.         Log.i(tag, "==================分割线======================"); 
  16.     }*/  
  17.     String destitle = attrs.getAttributeValue(NAMESPACE, "destitle");  
  18.     String desoff = attrs.getAttributeValue(NAMESPACE, "desoff");  
  19.     String deson = attrs.getAttributeValue(NAMESPACE, "deson");  
  20.     Log.i(tag, destitle);  
  21.     Log.i(tag, desoff);  
  22.     Log.i(tag, deson);  
  23. }  

  运行项目后在Logcat中打印下面的日志信息:

Android手机卫士(十七):自定义属性

  说明已经成功获取所设置的属性值

  这样就可以复用代码实现第二栏的电话归属地的布局

XML/HTML代码
  1. <com.wuyudong.mobilesafe.view.SettingItemView  
  2.     xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  3.     android:id="@+id/siv_update"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="wrap_content"  
  6.     mobilesafe:destitle="自动更新设置"  
  7.     mobilesafe:desoff="自动更新已关闭"  
  8.     mobilesafe:deson="自动更新已开启" >  
  9. </com.wuyudong.mobilesafe.view.SettingItemView>  
  10.   
  11. <com.wuyudong.mobilesafe.view.SettingItemView  
  12.     xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  13.     android:layout_width="match_parent"  
  14.     android:layout_height="wrap_content"  
  15.     mobilesafe:destitle="电话归属地的显示设置"  
  16.     mobilesafe:desoff="归属地的显示已关闭"  
  17.     mobilesafe:deson="归属地的显示已开启" >  
  18. </com.wuyudong.mobilesafe.view.SettingItemView>  
XML/HTML代码
  1. <com.wuyudong.mobilesafe.view.SettingItemView  
  2.         xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  3.         android:id="@+id/siv_update"  
  4.         android:layout_width="match_parent"  
  5.         android:layout_height="wrap_content"  
  6.         mobilesafe:destitle="自动更新设置"  
  7.         mobilesafe:desoff="自动更新已关闭"  
  8.         mobilesafe:deson="自动更新已开启" >  
  9.     </com.wuyudong.mobilesafe.view.SettingItemView>  
  10.   
  11.     <com.wuyudong.mobilesafe.view.SettingItemView  
  12.         xmlns:mobilesafe="http://schemas.android.com/apk/res/com.wuyudong.mobilesafe"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         mobilesafe:destitle="电话归属地的显示设置"  
  16.         mobilesafe:desoff="归属地的显示已关闭"  
  17.         mobilesafe:deson="归属地的显示已开启" >  
  18.     </com.wuyudong.mobilesafe.view.SettingItemView> 
本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/696.html
2017年7月21日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:0