先日Android Studio 3.5 -> 3.6へアップデートして、新機能をチェックしていた中で、ひとつ目に留まったのがViewBinding。
build.gradle(app)
android{ compileSdkVersion… : viewBinding.enabled = true : }
これを追加すると、レイアウトファイルに対して自動的にレイアウトクラスが生成される。
例えば、レイアウトファイル「activity_main.xml」が存在した場合、レイアウトクラス「ActivityMainBinding」が生成される。
onCreateでレイアウトファイルをinflateする代わりに、レイアウトクラスをinflateすると、その戻り値となるレイアウトクラスインスタンスのメンバ変数としてfindViewById済みのView参照が得られる。
MainActivity.java
protected void onCreate(Bundle savedInstanceState) { : //setContentView(R.layout.activity_main); これまでの方法 ActivityMainBinding binding = ActivityMainBinding.inflate(layoutInflater); //bindingをクラス変数にすると良い setContentView(binding.root); : binding.textView.setText("わーい"); : }
楽ちん。
フラグメントでViewBindingを使う場合は、onDestroyViewで解放が必要。※日本語版ドキュメントには記載が無い。英語版で確認すること。
HogeFragment.javaprivate ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { binding = null; }
ViewBinding使う上でActivity・Fragmentに共通する注意点は、ロジック内でViewを追加するとViewBindingでは対応できないということ。
ActivityやFragmentのコードからViewを生成せず、カスタムビューを作ってレイアウトファイルに書いておけば幸せになれる?のかも。
詳細は公式で
意訳元https://developer.android.com/のライセンス解釈
ソースコードから抽出されたドキュメントやコードはAndroid Open Source Projectの優先ライセンスであるApache 2.0 licenseが適用され、それ以外のコンテンツはCC BY 2.5が適用されている。
よって、ページ全体の意訳についてはCC BY 2.5における翻案行為、ページ内のコード転載についてはApache 2.0 licenseにおける頒布行為にあたると解釈している。