【问题标题】:How to use <merge> with view binding? [duplicate]如何将 <merge> 与视图绑定一起使用? [复制]
【发布时间】:2020-01-15 09:53:41
【问题描述】:

我无法让带有合并根标记的布局与视图绑定一起使用。有可能吗?

include_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/include_test"
        layout="@layout/merge_layout"/>
</FrameLayout>

merge_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/include_test">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="A Title"/>
</merge>
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  val binding = IncludeLayoutBinding.inflate(layoutInflater)
  setContentView(binding.root)
  binding.includeTest.title.text = "New Title"
}

运行时异常: java.lang.NullPointerException: Missing required view with ID: includeTest

【问题讨论】:

标签: android android-viewbinding


【解决方案1】:

基于this article 这是可能的

例如:

my_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <include
    layout="@layout/my_include_layout"/>
</LinearLayout>

my_include_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<merge
  xmlns:android="http://schemas.android.com/apk/res/android">
  <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />
</merge>

MyFragment.kt

class MyFragment: Fragment() {
 private val binding: MyFragmentBinding get() = _binding!!
 private var _binding: MyFragmentBinding? = null
 private val myIncludeLayoutBinding: MyIncludeLayoutBinding get() = _myIncludeLayoutBinding!!
 private var _myIncludeLayoutBinding: MyIncludeLayoutBinding? = null

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    _binding = MyFragmentBinding.inflate(inflater, container, false)
    _myIncludeLayoutBinding = MyIncludeLayoutBinding.bind(binding.root)
    return binding.root
 }

 override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    myIncludeLayoutBinding.button.setOnClickListener{
        
    }
 }

 override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
    _myIncludeLayoutBinding = null
 }
}

【讨论】:

    【解决方案2】:

    不支持。

    在此处查看官方文档:

    https://developer.android.com/topic/libraries/data-binding/expressions

    编辑: 糟糕,那些文档谈论的是数据绑定,而不是视图绑定。

    【讨论】:

    • 链接页面谈到在这种情况下不支持 data 绑定,但问题是关于 view 绑定。
    • 它谈到不支持 作为合并的直接子级。但数据绑定确实支持包含 布局,如作者示例中的
    猜你喜欢
    • 2020-09-07
    • 2018-05-16
    • 1970-01-01
    • 2023-03-17
    • 2020-02-21
    • 2016-08-07
    • 2020-01-11
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多