26
25

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.

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

Posted at

やりたいこと

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

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を作った方がいいのかもしれないです。そのうち試してみます。

以上です。

26
25
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
26
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?