具有自定义属性的 Android 自定义 UI

我知道创建自定义 UI 元素(通过 View 或特定的 UI 元素扩展)是可能的。但是,是否有可能为新创建的 UI 元素定义新的属性或属性(我的意思是不是继承,而是全新的,以定义一些我无法用默认属性或属性处理的特定行为)

元素我的自定义元素:

<com.tryout.myCustomElement
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Element..."
android:myCustomValue=<someValue>
/>

那么,有可能定义 MyCustomValue吗?

Thx

69556 次浏览

是的,你可以。只要使用 <resource>标签。
像这样: < br >

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CodeFont" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
</resources>

官方网站连结

在 res/value 文件夹中创建 attr.xml,在那里可以定义属性:

<declare-styleable name="">
<attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

然后,当您想在布局文件中使用它时,必须添加

xmlns:customname="http://schemas.android.com/apk/res/your.package.name"

然后你可以使用 customname:myCustomValue=""的值

Yes. Short guide:

1. Create an attribute XML

/res/values/attrs.xml中创建一个新的 XML 文件,其中包含属性和类型

<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="MyCustomElement">
<attr name="distanceExample" format="dimension"/>
</declare-styleable>
</resources>

基本上,您必须为包含所有自定义属性的视图设置一个 <declare-styleable />(这里只有一个)。我从来没有找到一个完整的可能类型的列表,所以你需要看看来源之一,我猜。我知道的类型是 参考(另一个资源) ,颜色,布尔值,维度,浮点数,整数和字符串。它们很容易理解

2. 使用布局中的属性

除了一个例外,它的工作方式与上面相同。

<com.example.yourpackage.MyCustomElement
xmlns:customNS="http://schemas.android.com/apk/res/com.example.yourpackage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Element..."
customNS:distanceExample="12dp"
/>

直截了当。

3. 利用传递的值

修改自定义视图的构造函数以分析值。

public MyCustomElement(Context context, AttributeSet attrs) {
super(context, attrs);


TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
try {
distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
} finally {
ta.recycle();
}
// ...
}

在本例中,distanceExample是一个私有成员变量。TypedArray有很多其他的东西来解析其他类型的值。

就是这样。在 View中使用解析后的值来修改它,例如在 onDraw()中使用它来相应地改变外观。