如何在 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()
由于 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()