365連休

にわかのandroidとかの開発メモ。

Android Studio 3.6 【新機能】ViewBindingを使用してUI参照を簡単に取得する

f:id:neet_rookie:20200226222609p:plain

先日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.java
private 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を生成せず、カスタムビューを作ってレイアウトファイルに書いておけば幸せになれる?のかも。

 

 

詳細は公式で

developer.android.com

 

 

 

意訳元https://developer.android.com/ライセンス解釈
ソースコードから抽出されたドキュメントやコードはAndroid Open Source Projectの優先ライセンスであるApache 2.0 licenseが適用され、それ以外のコンテンツはCC BY 2.5が適用されている。
よって、ページ全体の意訳についてはCC BY 2.5における翻案行為、ページ内のコード転載についてはApache 2.0 licenseにおける頒布行為にあたると解釈している。