Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

DataBindingでTextViewに入力必須マークを付与する

More than 3 years have passed since last update.

やりたいこと

こんな感じで、ラベルの横に入力必須の * マークをつけたい場合、要素がたくさんあると地味にめんどくさいです。

Screenshot_2016-08-02-16-18-19_jpg__1080×1920_.png

BindingAdapterを使う

BindingAdapterを使えばxmlのattributesで書けます。
DataBindingはkotlinの拡張関数のようなもので、既存のViewに動きを付与できます。

適当なクラスに下記のようなstaticメソッドを書いておきます。自分は DataBindingAttributeUtilを作ってそこに置きました。

@BindingAdapter("requiredMarkVisible")
public static void requiredMarkVisible(TextView textView, boolean enable) {
    String text = textView.getText().toString();
    String requiredMark = " " + textView.getContext().getString(R.string.required_mark);

    if (enable) {
        textView.setText(Html.fromHtml(text + "<font color=\"#e86242\">" + requiredMark + "</font>"));
    } else {
        String defaultText = text.replace(requiredMark, "");
        textView.setText(defaultText);
    }
}

xmlではでこんな感じで書けます。 @{true}じゃなくてtrueで書きたいですが、何かいい方法があるんでしょうか。あれば知りたいです。

<TextView
    ...
    android:text="@string/name"
    app:requiredMarkVisible="@{true}"/>

補足

ちなみに、なぜ false の時にわざわざ text.replace(requiredMark, "") としているかというと、状態によって必須かどうかが動的に変わるケースがあるからです。
例えば以下のようにViewModelの状態が変わったらrequiredMarkVisibleも変更してほしいみたいな時のためです。

<TextView
    ...
    android:text="@string/name"
    app:requiredMarkVisible="@{viewModel.isNameRequired}"/>

所感

もしかしたらstringの%1$sとかをxml上でセットできるような、汎用的なBindingAdapterを作った方がいいのかもしれないです。そのうち試してみます。

以上です。

konifar
親方!空からどらえもんが!
http://konifar.hatenablog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away