自定义Attribution的使用
使用分为三步
第一步在attr中添加自定义的属性,如下所示
<resources>
<declare-styleable name="PreferenceWithTip">
<attr name="tipstring" format="string|reference"/>
<attr name="titlestring" format="string"/>
<attr name="img" format="reference"/>
<attr name="hint" format="string"/>
</declare-styleable>
<declare-styleable name="MyTextView">
<attr name="hintColor" format="reference"/>
<attr name="hintText" format="string"/>
<attr name="text" format="string"/>
<attr name="isSwitchabled" format="boolean"/>
</declare-styleable>
</resources>
第二步在自定义的view代码中获取自定义属性的值,并将值赋给所需要的控件
//成员变量的声明
String pTitle = null;
String tipstring = null;
Drawable res=null;
String hinttext=null;
//构造方法中通过TypedArray获取属性的值
//使用时需要添加Recycle的注解
@SuppressLint("Recycle")
public PreferenceWithTip(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PreferenceWithTip);
tipstring = ta.getString(R.styleable.PreferenceWithTip_tipstring);
pTitle = ta.getString(R.styleable.PreferenceWithTip_titlestring);
res=ta.getDrawable(R.styleable.PreferenceWithTip_img);
hinttext=ta.getString(R.styleable.PreferenceWithTip_hint);
//使用完需要调用recycle
ta.recycle();
}
…………
//然后在对应的地方获取控件,然后赋值给控件
TextView pTitleView = (TextView)view.findViewById(R.id.prefs_title);
pTitleView.setText(pTitle);
TextView pTipView = (TextView)view.findViewById(R.id.prefs_tip);
pTipView.setText(tipstring);
ImageView imageView=(ImageView)view.findViewById(R.id.prefs_icon);
imageView.setImageDrawable(res);
TextView hint=(TextView)view.findViewById(R.id.prefs_hint);
hint.setText(hinttext);
第三部就是使用了,使用有两种方式,一种是直接在xml代码中使用,另一种则是在自定义的view中对外暴露方法,通过setxx方法的方式传入
1.xml方法,如下所示
<com.example.gaotudemo.PreferenceWithTip
preference:tipstring=">"
preference:titlestring="课程兑换"
preference:hint="暂无可用券"
preference:img="@drawable/duihuan"/>
2.方法调用。
public void setHintText(String hintText){
if(hintText!=null) hint.setText(this.hintText);
}
使用注意事项:
1.attr中的format可以同时使用多个
如 所示,既能传入string类型,也能传入引用类型
2.那么如果同时传入引用类型和其他类型,如何判断呢?
以上一个的例子来说名,通过TypedArray,可以判断如果是string类型,则直接传入。
如果是引用类型,传入的该id,typearray首先会接受id,然后解析该id获取该id所指向的资源,最后返回该资源。
常见的attri格式
(参考https://www.jianshu.com/p/8c100000a1a2)
1. reference:参考某一资源ID
- 属性定义:
<declare-styleable name="名称">
<attr name="background" format="reference" />
</declare-styleable>
- 属性使用:
<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/图片ID" />
2. color:颜色值
- 属性定义:
<declare-styleable name="名称">
<attr name="textColor" format="color" />
</declare-styleable>
- 属性使用:
<TextView
android:layout_width="42dip"
android:layout_height="42dip"
android:textColor="#00FF00" />
- 代码使用
3. boolean:布尔值
- 属性定义:
<declare-styleable name="名称">
<attr name="focusable" format="boolean" />
</declare-styleable>
- 属性使用:
<Button
android:layout_width="42dip"
android:layout_height="42dip"
android:focusable="true" />
4. dimension:尺寸值
- 属性定义:
<declare-styleable name="名称">
<attr name="layout_width" format="dimension" />
</declare-styleable>
- 属性使用:
<Button
android:layout_width="42dip"
android:layout_height="42dip" />
5. float:浮点值
- 属性定义:
<declare-styleable name="AlphaAnimation">
<attr name="fromAlpha" format="float" />
<attr name="toAlpha" format="float" />
</declare-styleable>
- 属性使用:
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.7" />
6. integer:整型值
- 属性定义:
<declare-styleable name="AnimatedRotateDrawable">
<attr name="visible" />
<attr name="frameDuration" format="integer" />
<attr name="framesCount" format="integer" />
<attr name="pivotX" />
<attr name="pivotY" />
<attr name="drawable" />
</declare-styleable>
- 属性使用:
<animated-rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/图片ID"
android:frameDuration="100"
android:framesCount="12"
android:pivotX="50%"
android:pivotY="50%" />
7. string:字符串
- 属性定义:
<declare-styleable name="MapView">
<attr name="apiKey" format="string" />
</declare-styleable>
- 属性使用:
<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />
8. fraction:百分数
- 属性定义:
<declare-styleable name="RotateDrawable">
<attr name="visible" />
<attr name="fromDegrees" format="float" />
<attr name="toDegrees" format="float" />
<attr name="pivotX" format="fraction" />
<attr name="pivotY" format="fraction" />
<attr name="drawable" />
</declare-styleable>
- 属性使用:
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromDegrees="0"
android:interpolator="@anim/动画ID"
android:pivotX="200%"
android:pivotY="300%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360" />
9. enum:枚举值
- 属性定义:
<declare-styleable name="名称">
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
- 属性使用:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" />
10. flag:位或运算
- 属性定义:
<declare-styleable name="名称">
<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>
</declare-styleable>
- 属性使用:
<activity
android:name=".StyleAndThemeActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateUnspecified | stateUnchanged | stateHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意
属性定义时可以指定多种类型值,如:
- 属性定义:
<declare-styleable name="名称">
<attr name="background" format="reference|color" />
</declare-styleable>
- 属性使用:
<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/图片ID|#00FF00" />
```#### 自定义Attribution的使用
使用分为三步
第一步在attr中添加自定义的属性,如下所示
```
第二步在自定义的view代码中获取自定义属性的值,并将值赋给所需要的控件
//成员变量的声明
String pTitle = null;
String tipstring = null;
Drawable res=null;
String hinttext=null;
//构造方法中通过TypedArray获取属性的值
//使用时需要添加Recycle的注解
@SuppressLint("Recycle")
public PreferenceWithTip(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PreferenceWithTip);
tipstring = ta.getString(R.styleable.PreferenceWithTip_tipstring);
pTitle = ta.getString(R.styleable.PreferenceWithTip_titlestring);
res=ta.getDrawable(R.styleable.PreferenceWithTip_img);
hinttext=ta.getString(R.styleable.PreferenceWithTip_hint);
//使用完需要调用recycle
ta.recycle();
}
…………
//然后在对应的地方获取控件,然后赋值给控件
TextView pTitleView = (TextView)view.findViewById(R.id.prefs_title);
pTitleView.setText(pTitle);
TextView pTipView = (TextView)view.findViewById(R.id.prefs_tip);
pTipView.setText(tipstring);
ImageView imageView=(ImageView)view.findViewById(R.id.prefs_icon);
imageView.setImageDrawable(res);
TextView hint=(TextView)view.findViewById(R.id.prefs_hint);
hint.setText(hinttext);
第三部就是使用了,使用有两种方式,一种是直接在xml代码中使用,另一种则是在自定义的view中对外暴露方法,通过setxx方法的方式传入
1.xml方法,如下所示
<com.example.gaotudemo.PreferenceWithTip
preference:tipstring=">"
preference:titlestring="课程兑换"
preference:hint="暂无可用券"
preference:img="@drawable/duihuan"/>
2.方法调用。
public void setHintText(String hintText){
if(hintText!=null) hint.setText(this.hintText);
}
使用注意事项:
1.attr中的format可以同时使用多个
如 所示,既能传入string类型,也能传入引用类型
2.那么如果同时传入引用类型和其他类型,如何判断呢?
以上一个的例子来说名,通过TypedArray,可以判断如果是string类型,则直接传入。
如果是引用类型,传入的该id,typearray首先会接受id,然后解析该id获取该id所指向的资源,最后返回该资源。
常见的attri格式
(参考https://www.jianshu.com/p/8c100000a1a2)
1. reference:参考某一资源ID
- 属性定义:
<declare-styleable name="名称">
<attr name="background" format="reference" />
</declare-styleable>
- 属性使用:
<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/图片ID" />
2. color:颜色值
- 属性定义:
<declare-styleable name="名称">
<attr name="textColor" format="color" />
</declare-styleable>
- 属性使用:
<TextView
android:layout_width="42dip"
android:layout_height="42dip"
android:textColor="#00FF00" />
- 代码使用
3. boolean:布尔值
- 属性定义:
<declare-styleable name="名称">
<attr name="focusable" format="boolean" />
</declare-styleable>
- 属性使用:
<Button
android:layout_width="42dip"
android:layout_height="42dip"
android:focusable="true" />
4. dimension:尺寸值
- 属性定义:
<declare-styleable name="名称">
<attr name="layout_width" format="dimension" />
</declare-styleable>
- 属性使用:
<Button
android:layout_width="42dip"
android:layout_height="42dip" />
5. float:浮点值
- 属性定义:
<declare-styleable name="AlphaAnimation">
<attr name="fromAlpha" format="float" />
<attr name="toAlpha" format="float" />
</declare-styleable>
- 属性使用:
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.7" />
6. integer:整型值
- 属性定义:
<declare-styleable name="AnimatedRotateDrawable">
<attr name="visible" />
<attr name="frameDuration" format="integer" />
<attr name="framesCount" format="integer" />
<attr name="pivotX" />
<attr name="pivotY" />
<attr name="drawable" />
</declare-styleable>
- 属性使用:
<animated-rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/图片ID"
android:frameDuration="100"
android:framesCount="12"
android:pivotX="50%"
android:pivotY="50%" />
7. string:字符串
- 属性定义:
<declare-styleable name="MapView">
<attr name="apiKey" format="string" />
</declare-styleable>
- 属性使用:
<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />
8. fraction:百分数
- 属性定义:
<declare-styleable name="RotateDrawable">
<attr name="visible" />
<attr name="fromDegrees" format="float" />
<attr name="toDegrees" format="float" />
<attr name="pivotX" format="fraction" />
<attr name="pivotY" format="fraction" />
<attr name="drawable" />
</declare-styleable>
- 属性使用:
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromDegrees="0"
android:interpolator="@anim/动画ID"
android:pivotX="200%"
android:pivotY="300%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360" />
9. enum:枚举值
- 属性定义:
<declare-styleable name="名称">
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
- 属性使用:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" />
10. flag:位或运算
- 属性定义:
<declare-styleable name="名称">
<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>
</declare-styleable>
- 属性使用:
<activity
android:name=".StyleAndThemeActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateUnspecified | stateUnchanged | stateHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意
属性定义时可以指定多种类型值,如:
- 属性定义:
<declare-styleable name="名称">
<attr name="background" format="reference|color" />
</declare-styleable>
- 属性使用:
<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/图片ID|#00FF00" />