自定义属性步骤:
- 自定义一个CustomView(extends View )类,也可以继承现有的类,比如LinearLayout或者ImageView
- 编写values/attrs.xml,在其中编写styleable和item等标签元素
- 在布局文件中CustomView使用自定义的属性(注意namespace)
- 在CustomView的构造方法中通过TypedArray获取
开始编写一个自定义类。
public class MyView extends LinearLayout{ private ImageView imageView; private TextView textView; private CharSequence text; private Drawable drawable; private float textSize; public MyView(Context context) { super(context); } public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initView(context,attrs); } public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context,attrs); } private void initView(Context context, @Nullable AttributeSet attrs){ //注意这个地方R.styleable.MyView中styleable必须是它,后面跟的是自定义控件的名字 //或者是values/attrs中自定义属性的name TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyView); //values/attrs中MyView下面的text,使用MyView_text中方式获取,注意下划线 text = array.getText(R.styleable.MyView_text); if(text == null){ text = ""; } Drawable d = array.getDrawable(R.styleable.MyView_src); if(d != null){ drawable = d; }else { throw new RuntimeException("图像资源为空"); } textSize = array.getDimension(R.styleable.MyView_textSize,12); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.image_button_layout,this); imageView = (ImageView) findViewById(R.id.icon_part); imageView.setImageDrawable(drawable); textView = (TextView) findViewById(R.id.text_part); textView.setTextSize((float) textSize); textView.setText(text); if(text.equals("")||text==null){ textView.setVisibility(View.GONE); } array.recycle(); } }编写values/attrs.xml,在其中编写styleable和item等标签元素
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView"> <attr name="text" format="reference"/> <attr name="src" format="reference"/> <attr name="textSize" format="dimension"/> </declare-styleable> </resources>
使用
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cxd="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.xuedongchao.myattrs.activity.MainActivity"> <com.example.xuedongchao.myattrs.view.MyView android:id="@+id/my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" cxd:src="@mipmap/ic_launcher" cxd:text="@string/test" cxd:textSize="14sp"/> </RelativeLayout>
注意:xmlns:cxd="http://schemas.android.com/apk/res-auto" 否则不能使用自定义属性
自定义属性值类型
1. reference:参考某一资源ID。
(1)属性定义:
- <declare-styleable name="名称">
- <attr format="reference" name="background" />
- </declare-styleable>
(2)属性使用:
- <ImageView
- android:layout_width="42dip"
- android:layout_height="42dip"
- android:background="@drawable/图片ID" />
2. color:颜色值。
(1)属性定义:
- <declare-styleable name="名称">
- <attr format="color" name="textColor" />
- </declare-styleable>
(2)属性使用:
- <TextView
- android:layout_width="42dip"
- android:layout_height="42dip"
- android:textColor="#00FF00" />
3. boolean:布尔值。
(1)属性定义:
- <declare-styleable name="名称">
- <attr format="boolean" name="focusable" />
- </declare-styleable>
(2)属性使用:
- <Button
- android:layout_width="42dip"
- android:layout_height="42dip"
- android:focusable="true" />
4. dimension:尺寸值。
(1)属性定义:
- <declare-styleable name="名称">
- <attr format="dimension" name="layout_width" />
- </declare-styleable>
(2)属性使用:
- <Button
- android:layout_width="42dip"
- android:layout_height="42dip" />
5. float:浮点值。
(1)属性定义:
- <declare-styleable name="AlphaAnimation">
- <attr format="float" name="fromAlpha" />
- <attr format="float" name="toAlpha" />
- </declare-styleable>
(2)属性使用:
- <alpha
- android:fromAlpha="1.0"
- android:toAlpha="0.7" />
6. integer:整型值。
(1)属性定义:
- <declare-styleable name="AnimatedRotateDrawable">
- <attr format="integer" name="frameDuration" />
- <attr format="integer" name="framesCount" />
- </declare-styleable>
(2)属性使用:
- <animated-rotate
- android:frameDuration="100"
- android:framesCount="12"
- />
7. string:字符串。
(1)属性定义:
- <declare-styleable name="MapView">
- <attr format="string" name="apiKey" />
- </declare-styleable>
(2)属性使用:
- <com.google.android.maps.MapView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />
8. fraction:百分数。
(1)属性定义:
- <declare-styleable name="RotateDrawable">
- <attr format="fraction" name="pivotX" />
- <attr format="fraction" name="pivotY" />
- </declare-styleable>
(2)属性使用:
- <rotate
- android:pivotX="200%"
- android:pivotY="300%"
- />
9. enum:枚举值。
(1)属性定义:
- <declare-styleable name="名称">
- <attr name="orientation">
- <enum name="horizontal" value="0" />
- <enum name="vertical" value="1" />
- </attr>
- </declare-styleable>
(2)属性使用:
- <LinearLayout
- android:orientation="vertical" >
- </LinearLayout>
10. flag:位或运算。
(1)属性定义:
- <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>
(2)属性使用:
- <activity
- android:windowSoftInputMode="stateUnspecified | stateUnchanged | stateHidden" >
- </activity>
注意:属性定义时可以指定多种类型值:
(1)属性定义:
- <declare-styleable name="名称">
- <attr format="reference|color" name="background" />
- </declare-styleable>
(2)属性使用:
- <ImageView
- android:layout_width="42dip"
- android:layout_height="42dip"
- android:background="@drawable/图片ID|#00FF00" />