LoginSignup
7
6

More than 5 years have passed since last update.

Databinding を使っていて、うまくいかないときに確認すること

Last updated at Posted at 2017-10-11

何度か binding ファイルが自動生成されなくてハマることがあったのでメモ

生成されるファイル名を勘違いしている

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

上のコードはコンパイルエラーになる。Activity の名前は MainActivity だが、Databinding はレイアウトファイルの名前に従って生成されるので、生成されるクラスの名前はActivityMainBinding という名前になる。 MainActivityBinding と勘違いして結構ハマった。

layout タグで囲ったのに自動生成してくれない

こんな感じで layout タグで囲ったのに自動生成されない

<layout>
    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>

これは xmlns:android 記述箇所が TextView になってしまっているのが、原因。これをちゃんと正しい場所に配置すると自動生成してくれる

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>

こんな感じ。

id 対応する View を作ってくれない

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>

binding.myTextView が自動的に生成されるはずなのになぜかない。これは id の指定方法が間違っているのが原因。正確には @+id/my_text_view とする必要がある。findViewById の場合は + がついてなくても動くが DataBinding ではだめなようだ。

以下のように @+id の正しい形式に直せばよし。

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>

こんな感じ!

レイアウトファイルでコンパイルエラーが発生した。該当部分を直したけど、毎回元に戻されて修正が反映されない

よくタブを見ると自動生成されたレイアウトファイルを開いて編集していませんか?

ビルドエラー時に開かれるファイルが自動生成されたファイルなので、元のファイルを手動で開いて編集する必要がある。これは Android Studio 2.3 のバグではないだろうか・・。

レイアウトファイルで補完が効かない

以下のようなコードの data タグの中身はちゃんと補完してくれるが、activity.getMyText のところは補完してくれない。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="activity"
            type="ore.MainActivity"
    </data>
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@{activity.getMyText}"
        android:orientation="vertical">
    </LinearLayout>
</layout>

あと部分的にしかジャンプできない。これは最初書き方をミスっているのかと思っていたが、仕様らしい。
これが微妙すぎるので onClick とかをレイアウトファイルに書くのをやめた。

リファクタリング(リネームとか)すると、おかしなところまで編集しようとする

これたぶん Android Studio 2.3 のリファクタリング機能がバグってる。Databinding を使っている箇所は基本的にリファクタリング機能が使えない、もしくは注意してリファクタリング機能を使う必要があるという認識である必要があるっぽい。

7
6
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
7
6