Android View Bindingの使い方入門
前文
Android Studio安定版3.6がリリースされ、いくつかの新しい変更がもたらされました。まず、外観ですが、スタートページが変更され、ロゴもより現代的になりました。複数の画面サイズの表示を同時にプレビューするマルチプレビュー機能が追加され、エミュレータはマルチスクリーンをサポートし、新しいビュー結合コンポーネントView Bindingもようやくサポートされました。
これまでは、findViewById、およびkotlinでAndroid Kotlin Extensionsを導入し、idで直接アクセスすることでビューとやりとりしていました。前者はテンプレート化が進んでおり、多くのコードが重複しています。後者は最も便利な方法です。そして、新しい選択肢として、View Bindingがあります。
<ブロッククオートビューバインドの機能は、ビューと相互作用するコードを簡単に書くことができるようにします。あるモジュールでビューバインディングを有効にすると、そのモジュールの各XMLレイアウトファイルに対してバインディングクラスが生成されます。バインディングクラスのインスタンスは、対応するレイアウトの ID を持つすべてのビューへの直接参照を含んでいます。
ほとんどの場合、ビューバインディングは findViewById を置き換えます。
使用方法
View Bindingはモジュール単位で有効にすることができます。モジュールで有効にするには、モジュールのbuild.gradleに以下の設定を追加します。
android {
...
viewBinding {
enabled = true
}
}
使用方法
モジュールに対してビューバインディングが有効な場合、モジュールに含まれる各XMLレイアウトファイルに対して、バインディングクラスが生成されます。各バインディングクラスは、ルートビューと ID を持つすべてのビューへの参照を含んでいます。バインディングクラスのクラス名は、xmlの名前の後に"Binding"をつけたものです。
例えば、レイアウトファイルの名前が、activity_main.xmlだったとします。
<LinearLayout ... >
<TextView android:id="@+id/tvName" />
<TextView android:text="no id"/>
<Button android:id="@+id/btnOpen"/>
</LinearLayout>
このクラスは2つのメンバー変数tvNameとbtnOpenを持ち、またルートビュー(この場合はLinearLayout)を返すgetRoot()メソッドも含んでいます。
バインディングクラスのインスタンスを取得するには、static inflate() メソッドを使用します。
private lateinit var binding: ActivityMainBinding
@Override
fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(inflater)
setContentView(binding.root)
}
バインディングクラスのインスタンスは、任意のビューを参照するために使用することができるようになりました: バインディングクラスのインスタンスは、任意のビューを参照するために使用することができます。
binding.tvName = "name"
binding.btnOpen.setOnClickListener{
Log.d(TAG,"btnOpen click")
}
区別
findViewByIdとの違い:ヌルセーフかつタイプセーフで、不正なidを参照したことによるヌルポインタ例外や型変換例外が発生しない。
データバインディングとの違い:データバインディングは、<layout>コードで作成されたデータバインドされたレイアウトのみを扱います。View Bindingはレイアウト変数やレイアウト式をサポートしていないので、レイアウトをxmlのデータに結合するために使用することはできません。
Android Kotlin Extensionsとの違い:使用上、後者はシンプルで残酷、idに直接アクセスできるのに対し、View Bindingはバインディングクラスのインスタンスを作成する必要があります。後者は、同じidが複数のxmlに存在し、間違ったパッケージを導きやすく、パッケージを誤ると、他のViewで間違ったidを使用し空ポインターになってしまう可能性もありますが、View Bindingでは明らかにそうなっていない点があります。
概要
findViewByIdや他のViewインジェクションフレームワークで選択する場合、よりクリーンで安全なコードのためにView Bindingを選択することが推奨されます。
データバインディングを使用しているプロジェクトであれば、ルートタグに<layout>でないxmlを処理するための補助としてView Bindingを使用できます(ps: このシナリオは発生しそうにないですね?このシナリオも避けるべきです。結局のところ、あまりに多くのクラス生成はビルド速度に影響を与え、インストールパッケージのサイズを増加させることになります)
Android Kotlin Extensionsのどちらを選ぶかは、現在のところ最適解はなく、開発者が開発効率を最大化し、クリーンで使いやすいコード(Android Kotlin Extensions)を望むか、堅牢性と最小限のエラーを好むか(View Binding)によって、どちらも良いものだと思います。
ちなみに、View Bindingは現在includeタグで導入されたxmlには対応しておらず、View Bindingがどの程度改善されるのか、今後どこにフィットするのか、Android Kotlin Extensionsを凌駕することができるのか、注目していく必要があります。
2020年11月11日に更新しました。Android Stuidio 4.1 以上では、新規に作成されたプロジェクトでは kotlin-android-extensions プラグインはデフォルトで削除されました。
そのため、使用することをお勧めします。
-
findViewById
-
ViewBinding
-
データバインディング
関連
-
よくあるJavaのエラー50選(その1)
-
Androidアップグレード/ブラシ戦略(GoogleネイティブシステムPixel)
-
AndroidStdioのインストール時に「メインクラスが見つからない com/intelligi/idea/Main」というエラーが発生する。
-
Android Studioプロジェクトをインポートすると、無効なgradle jdkコンフィギュレーションが見つかったと報告される
-
エラーの解決方法 URIがandroid studioのxmlファイルに登録されていない。
-
Android 開発 キーボード イベント モバイル ミッキーマウス ケース
-
Android ビューの階層構造
-
Android studioでTextViewのフォントを変更する2つの方法(例:模造歌、公式スクリプト)。
-
AndroidManifest.xml ファイルが見つからない 解決策
-
Android.view.InflateException: バイナリ XML ファイルの行番号 0: クラス <unknown> を展開する際のエラー 解決方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン