【问题标题】:Android BindAdapter with custom attribute with custom values (similar to visible attribute)具有自定义值的自定义属性的 Android BindAdapter(类似于可见属性)
【发布时间】:2020-10-08 06:25:04
【问题描述】:

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

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

<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 可以自动完成我可以使用的可能性。

【问题讨论】:

    标签: android kotlin data-binding android-databinding


    【解决方案1】:

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

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

    然后你可以直接在你的xml中传递枚举:

    app:item_id="@{ItemID.BLACK_GLOVES}"
    

    这样,您输入的可能性有限,并且不太可能意外输入无意义的整数。

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

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

    【讨论】:

      【解决方案2】:

      试试这个:

      @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" />
      

      【讨论】:

        猜你喜欢
        • 2011-11-28
        • 2013-09-01
        • 2014-01-12
        • 1970-01-01
        • 2015-05-11
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多