1. ホーム
  2. android

[解決済み] ViewBinding - インクルードされたレイアウトのバインディングを取得する方法は?

2022-04-24 15:25:12

質問

ViewBindingを使用しているとき、いくつかの文書化されていないケースに遭遇しました。

1つ目:メインバインディングはメインレイアウトのアイテムのみを表示し、含まれる汎用ビューレイアウトパーツのバインディングを取得する方法?

2つ目: どのようにマージタイプのレイアウトパーツを含むバインディングを取得しますか?

どうすればいいですか?

の場合。

  1. 一般的なレイアウトでインクルードする場合(マージノードではない)、インクルードされたパーツにIDを割り当てる必要がある、こうすればバインディングでインクルードされたサブパーツにアクセスできる
<include
    android:id="@+id/your_id"
    layout="@layout/some_layout" />

このようにアクティビティコードに

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    setContentView(exampleBinding.root)
    //we will be able to access included layouts view like this
    val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}

  1. 外部レイアウトのマージブロックにインクルードします。マージブロックはビューではないので、それにIDを追加することはできません。 このような永遠のマージレイアウト(merge_layout.xm)を持っているとしましょう。
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="@layout/activity_example">

    <TextView
        android:id="@+id/some_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
</merge>

このようなマージレイアウトを適切にバインドするためには、次のようなことが必要です。

アクティビティコードの中で

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding  //merge_layout.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    //we need to bind the root layout with our binder for external layout
    mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
    setContentView(exampleBinding.root)
    //we will be able to access included in merge layout views like this
    val mergedView: View = mergeBinding.someView
//[...]
}