[Android]JavaでfindViewByIdにサヨナラするための2つの方法①(データバインディングライブラリ)

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="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://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="http://schemas.android.com/apk/res/android" ← ルートを「layout」に
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://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」とサヨナラしたい場合は、中々使えるのではないかと思います。

(下の動画で詳しく解説していますので、よろしければご覧ください)

こんな記事も読まれています

おすすめコンテンツ




Flutter(フラッター)


みんプロ作成アプリ




TOP