Android 自定义组件 - 自定义属性 - 基础
attrs.xml
自定义属性,是在 res/values/attrs.xml 文件。
<?xml version="1.0" encoding="utf-8"?>
<resources>
//定义<declare-styleable />
</resources>
declare-styleable
定义:
<declare-styleable name="名称">
<attr name="属性名" format="属性类型">
</attr>
</declare-styleable>
属性类型
enum
integer
dimension
reference
string
boolean
color
flags
float
fraction
前提
CellText2.java:
public class CellText2 extends RelativeLayout {
private static final String TAG = CellText2.class.getSimpleName();
public CellText2(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.abc_cell_text2, this);
TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.CellText2);
/**
获取属性值
*/
int orientationValue = ta.getInt(R.styleable.CellText2_orientation,0);
Log.e(TAG, "orientationValue = " + orientationValue);
ta.recycle();
}
}
在某个 XML 文件内加载:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mzc="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#fff">
/**
加载自定义组件、定制属性。
*/
</LinearLayout>
enum
<attr name="orientation" format="enum">
<enum name="vertical" value="0"/>
<enum name="horizontal" value="1"/>
</attr>
加载到 XML 文件:
<com.example.muzico.test.CellText2
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#33333333"
mzc:orientation="vertical"
/>
CellText2.java 中处理:
int orientationValue = ta.getInt(R.styleable.CellText2_orientation, 0);
Log.e(TAG, "orientationValue = " + orientationValue);
integer
<attr name="test_integer" format="integer" />
加载到 XML 文件:
<com.example.muzico.boxuegu.abc.CellText2
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#33333333"
mzc:test_integer="3"
/>
CellText2.java 中处理:
int integerValue = ta.getInteger(R.styleable.CellText2_test_integer,0);
Log.e(TAG, "integerValue = " + integerValue);
dimension
<attr name="test_dimension" format="dimension" />
加载到 XML 文件:
<com.example.muzico.test.CellText2
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#33333333"
mzc:test_dimension="100dp"
/>
CellText2.java 中处理:
float dimensionValue = ta.getDimension(R.styleable.CellText2_test_dimension,0);
Log.e(TAG, "dimensionValue = " + dimensionValue);
得到的结果是 150。
为啥呢。。。里面涉及很复杂的逻辑,反正这里是不会讲解的。
那么上面得到的150,到底是什么数值呢?
更改一下属性值:
mzc:test_dimension="100px"
最后得到的就是 100。
结果很明显,得到的数值就是 px 值。
reference
<attr name="test_reference" format="reference" />
加载到 XML 文件:
<com.example.muzico.test.CellText2
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#33333333"
mzc:test_reference="@mipmap/launch_bg"
/>
CellText2.java 中处理:
int referenceValue = ta.getResourceId(R.styleable.CellText2_test_reference, 0);
imageViewRight.setImageResource(referenceValue);
或
imageViewRight.setBackgroundResource(referenceValue);
string
<attr name="test_string" format="string" />
加载到 XML 文件:
<com.example.muzico.test.CellText2
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#33333333"
mzc:test_string="hello world"
/>
CellText2.java 中处理:
String stringValue = ta.getString(R.styleable.CellText2_test_string);
Log.e(TAG, "stringValue = " + stringValue);
boolean
<attr name="test_boolean" format="boolean" />
加载到 XML 文件:
<com.example.muzico.test.CellText2
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#33333333"
mzc:test_boolean="true"
/>
CellText2.java 中处理:
boolean booleanValue = ta.getBoolean(R.styleable.CellText2_test_boolean,false);
Log.e(TAG, "booleanValue = " + booleanValue);