Androidアプリを作る際に、レイアウトファイルに貼り付けたビュー(View)をソースファイルで使うためには、Activity#findViewByIdメソッドを使って、レイアウトファイルとソースファイル間のビューの結びつけをする必要があります。
これは、ビューが少なければいいのですが、使うビューが多ければ多いほど、処理の本質ではない「findViewById」メソッドのコードがこんな感じで増えてしまって、書くのも読むのも面倒な状況になってしまいます。
textViewLeft = (TextView) findViewById(R.id.textViewLeft);
textViewOperator = (TextView) findViewById(R.id.textViewOperator);
textViewRight = (TextView) findViewById(R.id.textViewRight);
textViewMessage = (TextView) findViewById(R.id.textViewMessage);
buttonAnswerCheck = (Button) findViewById(R.id.buttonAnswerCheck);
imageView = (ImageView) findViewById(R.id.imageView);
textViewRemaining = (TextView) findViewById(R.id.textViewRemaining);
textViewCorrect = (TextView) findViewById(R.id.textViewCorrect);
textViewPoint = (TextView) findViewById(R.id.textViewPoint);
buttonBack = (Button) findViewById(R.id.buttonBack);
Javaの後継言語のKotlinであれば、「findViewById」にサヨナラするためのプラグインである「Kotlin Android Extensions」がAndroid Studioに標準で搭載されているので、何も考えること無く「findViewById」にサヨナラできるのですが、Javaの場合は残念ながら、標準ではそのような機能は備わっておわず、「どうしたもんかいな」という状況にあります。
この「どうしたもんかいな」をどうにかするための「データバインディングライブラリ」の最も簡単な使い方について、お伝えします。
(アノテーション処理などの詳しい説明は抜きで、とりあえずやり方だけ説明していますのでご了承下さい)
もくじ
「データバインディングライブラリ」とは
Google先生の本家本元公式リファレンスによると、「データバインディングライブラリ」とは、
宣言的なレイアウトを作成し、アプリケーション ロジックとレイアウトをバインドするのに必要なコードを最小限に抑えるため
のライブラリなんだそうです。
このGoogle先生のサイトには、使い方も載っているのですが、ややわかりづらいので、以下のサイトを参考にさせて頂きました。

1.アプリケーションレベルのbuild.gradleで、データバインディングライブラリを使えるように設定
アプリケーションレベル(モジュールレベル)の「build.gradle」の「android」タグ内で、以下のように記述します。
android {
(他に色々書いてある)
dataBinding {
enabled true
}
}
2.レイアウトファイルのルートを「layout」タグで囲む
レイアウトファイルの「Design」ビューではなく、xmlのコードが書いてある「Text」タグの方から、レイアウトのルートを「layout」タグで括ってあげます。
こんな感じになっているのを
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="net.minpro.calculationtraining.MenuActivity">
<TextView
android:id="@+id/textView"
(他に色々書いてある)
</android.support.constraint.ConstraintLayout>
こんな感じにしてあげる
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="https://schemas.android.com/apk/res/android" ← ルートを「layout」に
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools">
<android.support.constraint.ConstraintLayout ← 元々のルートのレイアウトを一段下にする
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="net.minpro.calculationtraining.MainActivity"
tools:layout_editor_absoluteY="73dp"
tools:layout_editor_absoluteX="0dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
(他に色々書いてある)
</android.support.constraint.ConstraintLayout>
</layout>
3.一旦ビルドする
この段階で一旦ビルドしてあげると、「app => build => generated」フォルダ内に「dataBinding」フォルダが作られます(これがないと次に進んでもビューをバインドしてくれない)。
4.結びつけたいソースファイルに「バインドさせるためのインスタンス」を設定
レイアウトファイルと結びつけたいソースファイル(Javaファイル)で、ビューをバインドするためのコードを以下のように書く。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main); ← これを
ActivityMainBinding binding
= DataBindingUtil.setContentView(this, R.layout.activity_main); //←これに置き換える
(他に色々書いてある)
}
ここで使っている「ActivityMainBinding」というクラスは、3のビルドで自動的に作られたクラスで、レイアウトファイルの名称に応じてクラスの名前が変わります。
上の例では、レイアウトファイルの名前が「activity_main.xml」なので、「ActivityMainBinding」となりました。
5.「バインドさせるためのインスタンス」を経由してビューにアクセスできるようになる
以上でやることはおわりで、ビューのアクセスしたい場合は、4で設定した「バインドさせるためのインスタンス」を経由してアクセスすることが出来ます。
こんな感じで
レイアウトファイルのxmlのコードを直接いじらないといけない部分はありますが、Javaで「findViewById」とサヨナラしたい場合は、中々使えるのではないかと思います。
(下の動画で詳しく解説していますので、よろしければご覧ください)


















