ViewBinding の使用法
ViewBinding は、findViewById() を置き換えてビューをバインドできる新しいライブラリです。これは、ビュー階層内のビューにアクセスするタイプ セーフで null 許容の方法です。ButterKnife などの他のバインディング ライブラリと比較して、ViewBinding は Google によって公式に提供されており、使い方が簡単です。
ViewBinding を使用する手順は次のとおりです。
- build.gradle ファイルに次の依存関係を追加します。
android {
...
buildFeatures {
viewBinding true
}
}
dependencies {
...
implementation 'com.android.support:viewbinding:28.0.0-alpha1'
}
- レイアウト ファイルにタグを追加します。例:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
</layout>
- ViewBinding を使用して、コード内でビューをバインドします。次に例を示します。
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.container.setOnClickListener {
binding.textView.text = "You clicked me!"
}
}
}
この例では、ActivityMainBinding を使用して activity_main.xml 内のビューをバインドします。inflate() メソッドを使用してバインディング オブジェクトを作成し、setContentView() メソッドを使用してルート ビューを設定します。その後は、通常のレイアウトと同じようにビューにアクセスできます。
ViewBinding を使用する主な利点は、多くの定型コードを回避できることと、Kotlin の null 許容型を使用するため実行時の NullPointerExceptions を回避できることです。
アクティビティで ViewBinding を使用する
Activity で ViewBinding を使用するには、build.gradle ファイルに次の依存関係を追加する必要があります。
android {
...
buildFeatures {
viewBinding true
}
...
}
dependencies {
...
implementation 'com.android.support:viewbinding:28.0.0'
}
次に、次のコードをアクティビティのレイアウト ファイルに追加します。
<LinearLayout
...
>
<TextView
android:id="@+id/textView"
...
/>
<Button
android:id="@+id/button"
...
/>
</LinearLayout>
Activity で ViewBinding を使用する場合は、まず、Activity で ViewBinding オブジェクトを宣言し、onCreate() メソッドで初期化する必要があります。
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
次に、バインディング オブジェクトを使用して、レイアウト内のコントロールを操作できます。
binding.textView.setText("Hello World!");
binding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
findViewById(R.id.text_view)
ViewBinding は、レイアウト ファイル内のコントロールの ID に基づいて、これらのコントロールに対応する変数名を生成するため、使用する場合は、対応する ViewBinding 変数名など、キャメルケースの命名方法を使用する必要があることに注意してくださいbinding.textView
。
さらに、アクティビティに複数のレイアウト ファイルがある場合は、対応する ViewBinding オブジェクトを使用して、別のレイアウト ファイルのコントロールを操作する必要があることに注意してください。次に例を示します。
private ActivityMainBinding mainBinding;
private ActivityOtherBinding otherBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
otherBinding = ActivityOtherBinding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot()); // 设置默认布局
}
private void switchLayout(boolean isMain) {
if (isMain) {
setContentView(mainBinding.getRoot());
} else {
setContentView(otherBinding.getRoot());
}
}
フラグメントで ViewBinding を使用する
Fragment で ViewBinding を使用するには、Fragment の onCreateView メソッドで次の手順を実行する必要があります。
- 次のように、Fragment クラスで ViewBinding オブジェクトを定義します。
private var binding: FragmentExampleBinding? = null
- onCreateView メソッドで ViewBinding オブジェクトを取得します。
binding = FragmentExampleBinding.inflate(inflater, container, false)
- ViewBinding のルート ビューを返します。
return binding?.root
- フラグメントが破棄されたら必ずバインドを解除してください。
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
完全なサンプルコード:
class ExampleFragment : Fragment() {
private var binding: FragmentExampleBinding? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentExampleBinding.inflate(inflater, container, false)
return binding?.root
}
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
}