自分用のメモも兼ねて。
DataBindingを使ってTextViewのdrawbleLeft(Start)を使うために
下記のような指定すると、実は上手く行きません。
<layout>
<data>
<variable name="icon" type="int" />
</data>
<TextView
android:drawableLeft="@{icon}"
/>
</layout>
なぜなら、 この指定をするとcolorリソースとして認識されてしまうからなんですね。
DataBindingではIntergerとしてresource指定をすると勝手にcolorResourceとして認識されてしまうようです。
attrの定義を見れば分かりますが、
<attr name="drawableLeft" format="reference|color" />
こうなっています。
なので、
@BindingAdapter("drawableLeftFromResource")
fun drawableStartFromResource(textView: TextView, @DrawableRes res: Int) {
val drawables = textView.compoundDrawablesRelative
textView.setCompoundDrawables(
ContextCompat.getDrawable(textView.context, res)?.apply {
setBounds(0, 0, intrinsicWidth, intrinsicHeight)
},
drawables[1],
drawables[2],
drawables[3]
)
}
のようなBindingAdapterを定義して、
<layout>
<data>
<variable name="icon" type="int" />
</data>
<TextView
android:drawableLeftFromResource="@{icon}"
/>
</layout>
としてやると上手くいきます。
肝は
ContextCompat.getDrawable(textView.context, res)?.apply {
setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}
の部分で、setBoundsをしてやらないとiconを差し込むための余白ができないので、アイコンが表示されません。
同じ要領でRight、Top、Bottomにも適用可能です。