1. 为新控件添加自定义的属性:
主要步骤:
(1)在attrs.xml文件中声明属性,有 属性名:name 和 格式:format:
1 <declare-styleable name="MyToggleBtn"> // 声名属性集的名称,即这些属性是属于哪个控件的。
2 <attr name="current_state" format="boolean"/> // 声名属性 current_state 格式为 boolean 类型
3 <attr name="slide_button" format="reference"/> // 声名属性 slide_button 格式为 reference 类型
4 </declare-styleable>
所有的format类型,如下:
1 reference 引用
2 color 颜色
3 boolean 布尔值
4 dimension 尺寸值
5 float 浮点值
6 integer 整型值
7 string 字符串
8 enum 枚举值
(2)在布局文件中使用新属性,使用之前必须先声明自己的命名空间,如:
1 xmlns:heima="http://schemas.android.com/apk/res/com.himi.togglebtn"(包名)
说明:
xmlns 是XML name space 的缩写;
heima 可为任意写符
http://schemas.android.com/apk/res/ 此为android固定格式;
com.itheima.mytogglebtn 此应用的包名,如manifest配置文件中一致。
布局文件:
1 <RelativeLayout
2 xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:heima="http://schemas.android.com/apk/res/com.himi.myattrsdemo"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context="com.himi.myattrsdemo.MainActivity" >
8
9 <com.himi.myattrsdemo.MyView
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:layout_centerHorizontal="true"
13 android:layout_centerVertical="true"
14 android:background="@drawable/ic_launcher"
15
16 heima:test_msg="@string/app_name"
17 heima:test_bitmap="@drawable/ic_launcher"
18 />
19
20 </RelativeLayout>
(3)在自定义View的构造方法中,通过解析AttributeSet对象,获得所需要的属性值。
1 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyToggleBtn); // 由attrs 获得 TypeArray
2. 下面通过一个案例解析说明上面的过程,如下:
(1)首先新建一个新的"Android"工程,命名为"自定义属性",如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5iNyImZ0U2NjZzNyATNxkjNllzNzcDO3YTY1UmMiZzMm9CX4AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.jpeg)
(2)自定义一个MyView继承自View,如下:
(3)新建一个xml文件,命名为attrs.xml,放在res/values文件夹下,如下:
通过查看源码SDT/platforms/android-14/data/res/values/attrs.xml,获知如何什么一个attr(属性)格式:
(4)在activity_main.xml文件下修改命名空间,使用上面定义的属性,如下:
1 <RelativeLayout
2 xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:heima="http://schemas.android.com/apk/res/com.himi.myattrsdemo"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context="com.himi.myattrsdemo.MainActivity" >
8
9 <com.himi.myattrsdemo.MyView
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:layout_centerHorizontal="true"
13 android:layout_centerVertical="true"
14 android:background="@drawable/ic_launcher"
15
16 heima:test_msg="@string/app_name"
17 heima:test_bitmap="@drawable/ic_launcher"
18 />
19
20 </RelativeLayout>
1 package com.himi.myattrsdemo;
2
3 import android.content.Context;
4 import android.content.res.TypedArray;
5 import android.util.AttributeSet;
6 import android.view.View;
7
8 public class MyView extends View {
9
10 public MyView(Context context) {
11 super(context);
12 // TODO 自动生成的构造函数存根
13 }
14
15
16 /*
17 * 通过查看View的构造方法,获知MyView构造方法写法
18 */
19 public MyView(Context context, AttributeSet attrs) {
20 super(context, attrs);
21
22 /*
23 * AttributeSet 对xml布局文件解析后的结果,封装为AttributeSet对象
24 * 存储的都是原始文件。仅对数据进行简单加工
25 */
26 int count = attrs.getAttributeCount();
27 for (int i = 0; i < count; i++) {
28 String name = attrs.getAttributeName(i);
29 String value = attrs.getAttributeValue(i);
30 //System.out.println("name:"+name+"------value:"+value);
31 }
32
33 /**
34 * TypedArray:是对AttributeSet中的原始数据 按照 图纸中的说明(R.styleable.MyView中的类型声明)
35 * 创建出来具体的对象
36 */
37 //attrs参数:表示原材料. R.styleable.MyView:表示图纸
38 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);
39
40 /**
41 * 获得对象的个数
42 */
43 int taCount = ta.getIndexCount();
44 System.out.println("===========================");
45
46 for(int i = 0; i<taCount; i++) {
47 int itemId = ta.getIndex(i);
48 System.out.println("index:"+itemId);
49
50 switch (itemId) {
51 case R.styleable.MyView_test_bitmap:
52 ta.getDrawable(itemId);
53 int bitmapId = ta.getResourceId(itemId, 100);
54 System.out.println("bitmapId::"+bitmapId);
55 break;
56
57 case R.styleable.MyView_test_id:
58 ta.getInt(itemId, 10);
59 break;
60
61 case R.styleable.MyView_test_msg:
62 String msg = ta.getString(itemId);
63 System.out.println("test_msg::"+msg);
64 break;
65 }
66 }
67 }
68
69 }