使用Android上的数据绑定设置文本颜色

tom*_*ozb 18 android android-databinding

我正在尝试TextView使用数据绑定库设置文本颜色

android:textColor="@{holder.getTitleColor(context, item)}"
Run Code Online (Sandbox Code Playgroud)

Holder类中的方法定义如下

public int getTitleColor(Context context, Item item) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

无论我返回颜色int(@ColorInt)还是颜色资源(@ColorRes),它都会将文本绘制为纯白色.我究竟做错了什么?

Mar*_*ann 37

我似乎int提供的内容被解释为十六进制颜色,即使这个setter应该期望资源ID看起来很直观.

使用Context为每个可绑定视图生成的引用,并使用它将资源ID转换为您指向的颜色,如DataBinding Dev Guide中所述:

根据需要,生成一个名为context的特殊变量,用于绑定表达式.上下文的值是来自根View的getContext()的Context.

用它来设置这样的颜色:

 <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{data.text}"
            android:textColor="@{context.getColor(data.colorRes)}"
            />
Run Code Online (Sandbox Code Playgroud)

  • 如果您尝试在API级别低于23的设备中使用此解决方案,则会收到指示"java.lang.NoSuchMethodError"的错误.对于那些需要以前版本的解决方案的人,请使用:**android:textColor ="@ {context.getResources().getColor(data.colorRes)}"** (13认同)
  • 在 Androidx 中,您需要 &lt;import type="androidx.core.content.ContextCompat" /&gt; (5认同)

Meh*_*ion 7

除了@Mardann 的解决方案之外,这里还有一个更新的解决方案,它也适用于使用 ContextCompat.getColor() 低于 23 的 API:

<layout>

    <data>
        <import type="androidx.core.content.ContextCompat" />
        <variable
            name="data"
            type="com.example.myapp.MyDataObject" />
    </data>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{data.text}"
        android:textColor="@{ContextCompat.getColor(context, data.colorRes)}"/>
    </layout>
Run Code Online (Sandbox Code Playgroud)
  • 确保如上所示导入 ContextCompat。
  • 您可以自动将“上下文”作为 ContextCompat.getColor() 的方法参数,因为它将自动解析为视图的上下文。


Raj*_*ddy 7

就我而言,颜色值采用字符串格式(例如“#000000”)

1.字符串 TxtColor = "#000000"

2.导入“android.graphics.Color”

<layout>
    <data>
      <import type="android.graphics.Color"/>
      <variable name="txtColor" type="String"/>
    </data>
     .... other views

</layout>
Run Code Online (Sandbox Code Playgroud)

3.设置为 Desired View -- 在我的例子中是 TextView

    ........ other views
  <android.support.v7.widget.AppCompatTextView
        android:id="@+id/tvTitle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textcolor= "@{Color.parseColor(txtColor)}" //when we import android.graphics.Color we can access it's all methods present
        tools:text="Test"/>
       ...... other views
Run Code Online (Sandbox Code Playgroud)

4.从 Activity/Adapter 绑定——在我的例子中是 Adapter

inner class ViewHolder(private val binding: BindingClass) :
    RecyclerView.ViewHolder(binding.root) {

    fun setData(data: DataClass, TxtColor : String?) {
        binding.txtColor= TxtColor 
        binding.executePendingBindings()
    }
}
Run Code Online (Sandbox Code Playgroud)


Rav*_*avi 6

使用创建方法 BindingAdapter

@BindingAdapter({"bind:color"})
public static void setFont(TextView textView, Item item) {
    textView.setTextColor(<set color of your choice>);
}
Run Code Online (Sandbox Code Playgroud)

并从xml调用它

app:color="@{item}"
Run Code Online (Sandbox Code Playgroud)