0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BindingAdapterでTextViewのdrawable[Left/Right/Top/Bottom]を実現する

Posted at

自分用のメモも兼ねて。

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にも適用可能です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?