Android Gradle プロジェクトにビュー バインディングを追加する方法

ビュー バインディングを使用すると、ビューと対話するコードを簡単に作成できます。 Android Gradle プロジェクトでこれを設定する方法は次のとおりです。

ほとんどの Android 開発者はおそらく古典的なものに精通しているでしょう。 findViewById() 方法。 XML レイアウト内のいずれかのビューの ID を渡すと、そのビューのインフレートされたバージョンへの参照が返されます。 ただし、これはすべて、正しい ID を渡したこと、およびビューが実際に存在することを前提としています。 findViewById() には、取得できないビューを取得しようとすることを防ぐためのチェックが組み込まれていません。 「ビューバインディング」を入力します。

使用する代わりに findViewById() 必要な各ビューで、ビュー バインディングは各レイアウト XML のバインディング クラスを自動的に生成します。 ID を持つ各ビューは自動的にクラスに追加されるため、それらを直接参照できます。

Android Gradle プロジェクトにビュー バインディングを追加するのは非常に簡単です。

グラドルのセットアップ

ビュー バインディングは、Gradle のモジュール レベルで有効になります。 複数のモジュールがある場合は、モジュールごとに個別に有効にする必要があります。

の中に android モジュールレベルのブロック build.gradle、ビュー バインディングを有効にするオプションを追加します。

android {
...

buildFeatures {
viewBinding true
}
}

不正アクセスに関する警告が表示される場合がありますが、これは lint のバグなので無視しても問題ありません。

プロジェクトを同期すると、ビュー バインディングが有効になります。 それはとても簡単です。

ビューバインディングの使用

View Binding を使用する方法はいくつかありますが、その前に、バインディング クラスがどのように生成されるかについて説明しましょう。

クラス名の構文

という名前のレイアウト XML があるとします。 some_layout.xml. 対応するバインディング クラスには次の名前が付けられます。 SomeLayoutBinding. このパターンはすべてのファイルに当てはまります。

各単語 (ファイル名ではアンダースコアで区切られている) は大文字になり、アンダースコアは削除されます。 そして最後に「バインディング」が追加されます。

既存のビューを使用したインスタンス化

すでにレイアウト ファイルをインフレートしており、レイアウトのルートへの参照がある場合は、既存のレイアウトを使用するように View バインディング クラスに指示できます。

コトリン:

val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)

ジャワ:

SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);

たとえば、Fragment でバインディング クラスを使用したい場合は、次のようになります。

コトリン:

classSomeFragment : Fragment(R.layout.some_layout) {
//Lazy initialization means bind() won't be called until "binding" is referenced.
private val binding by lazy { SomeLayoutBinding.bind(view) }

override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)

//Once this method is called, you can start using the binding.
}
}

ジャワ:

publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;

publicSomeFragment(){
super(R.layout.some_layout);
}

@Override
publicvoidonViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);

//Initialize the binding.
binding = SomeLayoutBinding.bind(view);
}
}

新しいビューでインスタンス化する

バインディング クラスは、レイアウトのインフレートも処理します。

コトリン:

val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)

ジャワ:

SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);

このメソッドは、フラグメントとアクティビティの両方で役立ちます。

アン 例 フラグメント は次のようになります。

コトリン:

classSomeFragment : Fragment() {
private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?){
//The "root" of the binding class is the root of its layout.
return binding.root
}
}

ジャワ:

publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;

@Override
publicvoidonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//Initialize the binding.
binding = SomeLayoutBinding.inflate(inflater);
//The "getRoot()" method of the binding class returns the root of the layout.
return binding.getRoot();
}
}

アン アクティビティの例 は次のようになります。

コトリン:

classSomeActivity : AppCompatActivity() {
private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }

override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)

//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.root)
}
}

ジャワ:

publicclassSomeActivityextendsAppCompatActivity{
private SomeLayoutBinding binding = null;

@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

//Instantiate the binding.
binding = SomeLayoutBinding.inflate(getLayoutInflater());
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.getRoot());
}
}

ビューの参照

View バインディング クラスがセットアップされ、使用できるようになったので、実際に使用してみましょう。

その内容を言ってみましょう some_layout.xml は次のようなものです。

 android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>

コード内で参照する ID が多数あります。 ただし、バインディング クラスをインスタンス化している限り、参照は簡単です。

Kotlin では、ビューはその ID に一致する変数によって参照されますが、いくつかの変更があります。 アンダースコアが削除され、結果の文字列がキャメルケースになります。 たとえば、参考にするために some_frame_layout コードから、使用します binding.someFrameLayout. の someFrameLayout 変数はFrameLayoutのインスタンスになります。

val someFrameLayout: FrameLayout = binding.someFrameLayout

Java では、ビューは、Kotlin と同様の形式で、ID に一致するゲッター メソッドによって参照されます。 たとえば、参考にするために some_frame_layout、あなたは使うでしょう binding.getSomeFrameLayout(). このメソッドは FrameLayout のインスタンスを返します。

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

ビュー参照もバインディング内でフラット化されます。 参照する inner_imageview 参照するのと同じです some_frame_layout.

結論

ご覧のとおり、Android のビュー バインディングは実装も使用も簡単です。 多くの場合、それよりも使いやすいです。 findViewById().

ビュー バインディングの実装の詳細といくつかの例については、 Googleの公式ドキュメントを確認してください.