Android 具有自定义值的自定义属性的 BindAdapter(类似于可见属性)

Android BindAdapter with custom attribute with custom values (similar to visible attribute)

我已经成功制作了我的第一个绑定适配器,我想了解更多。

我想知道如何制作一个属性,该属性只能为我的视图获取不同状态的特定字符串。 例如每个视图都有可见性属性,它可以是“消失”、“可见”、“不可见”

<TextView
            android:id="@+id/loading_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="@id/inventory_items_recycler"
            app:layout_constraintEnd_toEndOf="@+id/inventory_items_recycler"
            app:layout_constraintStart_toStartOf="@id/inventory_items_recycler"
            app:layout_constraintBottom_toBottomOf="@id/inventory_items_recycler"
            android:textSize="18sp"
            android:visibility="gone"
            app:item_id="@{ItemID.BLACK_GLOVES.ordinal()}"
            />

我创建了一个名为 item_id 的自定义属性,它获取一个代表枚举值的数字。在我的绑定实用程序中,我有这段代码:

@BindingAdapter("item_id")
    public static void setItemName(TextView tv, int itemId) {
        tv.setText(ItemData.get(ItemID.values()[itemId]).getName());
    }

我更喜欢有类似于可见性属性的东西,它的值可以是“可见”、“不可见”或“消失”

奖金:: 我希望 android studio 可以自动完成我可以使用的可能性。

试试这个:

@BindingAdapter("isGone")
    @JvmStatic
    fun View.setVisibility(isGone: Boolean) {
        if (isGone) this.visibility = View.GONE else View.VISIBLE
    }

在你的 xml 里面:

<com.google.android.material.checkbox.MaterialCheckBox
            android:id="@+id/cb_class"
            style="@style/TextStyleNormal.White"
            android:layout_marginStart="@dimen/margin_large"
            isGone="@{isSharedDailyActivity}"// it take boolean value
            app:buttonTint="@color/white"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:useMaterialThemeColors="true" />

您可以将枚举直接传递给您的绑定适配器,而不是先将其转换为 int 再返回到枚举。

@BindingAdapter("item_id")
public static void setItemName(TextView tv, ItemID itemId) {
    ..
}

然后你可以直接在你的 xml:

中传递枚举
app:item_id="@{ItemID.BLACK_GLOVES}"

这样您输入的可能性就会受到限制,并且不太可能意外输入无意义的整数。

但是,绑定适配器和自定义属性是不同的。使用绑定适配器,您仍然需要使用绑定表达式的语法,即:“@{ }”。

另一方面,

android:visibility 是一个属性。您还可以为自定义视图定义自定义属性并获得类似的东西(输入选项数量有限,IDE 显示您的选项等)。但您不应将其与绑定适配器混淆。这是两个不同的概念。