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


113

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

例如元素我的自定义元素:

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

因此可以定义MyCustomValue吗?

谢谢



嘿,这里有一些关于android中的自定义属性的好文章-amcmobileware.org/android/blog/2016/09/11/custom-attributes
ArkadiuszCieśliński16年

看看我对这个相关问题的回答。
Helios

Answers:


258

是。简短指南:

1.创建一个属性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.使用布局中的属性

除了一个例外,其工作方式与上述相同。您的自定义属性需要它自己的XML名称空间。

<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()来相应地改变外观。


7
只需注意TypedArray。完成后请确保调用recycle()。
zskalnik 2013年

在这里你可以找到一个很好的列表github.com/android/platform_frameworks_base/blob/master/core/...
叶海亚

IDE(例如,eclipse)是否自动完成自定义属性的键/值?
2014年

23
对于gradle构建,您应该http://schemas.android.com/apk/res-auto在声明自定义名称空间时使用
Dori

2
在第3步中,您可以简单地使用String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");attr是在构造函数中传递的AttributeSet,而'initialText'是您的自定义属性名称
kosiara-Bartosz Kosarzycki

21

在res / values文件夹中,创建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=""


这不是答案,问题是如何以编程方式从Java更改
Fazal

-11

是的,您可以<resource>。只需使用标签。
像这样:

<?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>

官方网站链接


感谢您的回答。但是在资源中,我看到使用默认的“ android:”值。我的意思是,我可以将android:phoneNameSelected =“ true”作为自定义UI元素的参数吗?
Waypoint
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.