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 显示您的选项等)。但您不应将其与绑定适配器混淆。这是两个不同的概念。
我已经成功制作了我的第一个绑定适配器,我想了解更多。
我想知道如何制作一个属性,该属性只能为我的视图获取不同状态的特定字符串。 例如每个视图都有可见性属性,它可以是“消失”、“可见”、“不可见”
<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 显示您的选项等)。但您不应将其与绑定适配器混淆。这是两个不同的概念。