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」とサヨナラしたい場合は、中々使えるのではないかと思います。
(下の動画で詳しく解説していますので、よろしければご覧ください)