如何在 Android 中使用 ViewBinding 扩充 ViewStub

How to inflate a ViewStub using ViewBinding in Android

由于 Kotlin Synthetics 已弃用,我们正在迁移到 ViewBinding。

我尝试了很多关于 ViewStub、ViewBinding 的谷歌搜索和阅读文档,并为片段活动实现了 ViewBinding,包括合并标签,但是我找不到任何方法来使用 ViewBinding 来膨胀 ViewStub。

 <ViewStub
            android:id="@+id/viewStubLayout"
            tools:layout="@layout/view_demo_layout" />

请忽略 width 和 height 属性,因为它们是作为样式添加的,并已从此代码段中删除。

能否分享一下如何使用 ViewBinding 将此视图与另一个 xml 布局动态扩展。

即使在 ViewStub.java 文件中,class 级别的注释也指出,

The preferred way to perform the inflation of the layout resource is the following:

ViewStub stub = findViewById(R.id.stub);
View inflated = stub.inflate(); 

这是否意味着,我必须继续使用 R.layout.xxx_xx 来膨胀 viewstub。我不能使用特定 xml 文件的绑定对象来扩充视图吗?

I wrote 大约 ViewBinding 处于 Beta 阶段。除了 ViewStub,我涵盖了所有案例。 ViewStub 的情况与我链接文章中的 <Include> 的情况非常相似。 您需要做的是调用 ViewStub 布局的 bind() 函数并传递您添加 ViewStub 的根。记得在setOnInflateListener.

中调用bind()
class MainFragment : Fragment() {
private var binding: FragmentMainBinding by autoCleared()
private var stubBinding: StubBinding by autoCleared()

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
      binding = FragmentMainBinding.inflate(inflater, container, false)
      binding.stub.setOnInflateListener { _, inflateId -> stubBinding = StubBinding.bind(inflateId) }
      return binding.root
  }

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      super.onViewCreated(view, savedInstanceState)
      binding.stub.inflate()
      stubBinding.tvTestMe.text = "Hurray"
   }
}

@Somesh 回答中的一个小修正

传递给 StubBinding 的膨胀视图是错误的。我们实际上应该传递从 onInflate 侦听器

收到的视图
class MainFragment : Fragment() {
private var binding: FragmentMainBinding by autoCleared()
private var stubBinding: StubBinding by autoCleared()

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
      binding = FragmentMainBinding.inflate(inflater, container, false)
      binding.stub.setOnInflateListener { _, inflated -> stubBinding = StubBinding.bind(inflated) }
      return binding.root
  }

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      super.onViewCreated(view, savedInstanceState)
      binding.stub.inflate()
      stubBinding.tvTestMe.text = "Hurray"
   }
}

只需两行即可完成

binding.viewStub.layoutResource = R.layout.layoutId
binding.viewStub.inflate()