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

txu3uszq  于 2023-02-17  发布在  Android
关注(0)|答案(3)|浏览(233)

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

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

那么,是否可以定义MyCustomValue
谢谢

wqsoz72f

wqsoz72f1#

是的。简短指南:
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 />,它包含了你所有的自定义属性(这里只有一个)。我从来没有找到一个完整的可能类型列表,所以我想你需要查看一个类型的源代码。我知道的类型有 reference(到另一个资源),color,boolean,dimension,float,integer和string。它们是非常不言自明的
1.在布局中使用属性
其工作方式与上面所做的相同,但有一个例外:自定义属性需要自己的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"
   />

相当直接。
1.使用传递给您的值
修改自定义视图的构造函数以分析值。

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()中使用它来相应地更改外观。

sz81bmfz

sz81bmfz2#

在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=""

6za6bjd0

6za6bjd03#

是的,你可以。只要使用<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>

link from official website

相关问题