Android 带viewbinding的BaseFragment
要在android应用程序中使用Android 带viewbinding的BaseFragment,android,kotlin,android-mvvm,android-viewbinding,Android,Kotlin,Android Mvvm,Android Viewbinding,要在android应用程序中使用viewbinding,我基本上是为活动创建基类&片段,以删除每次编写膨胀代码时的样板文件 活动: BaseActivity带有viewbinding: abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCre
viewbinding
,我基本上是为活动创建基类
&片段
,以删除每次编写膨胀代码时的样板文件
活动:
BaseActivity
带有viewbinding
:
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = getViewBinding()
}
abstract fun getViewBinding(): VB
}
片段:
BaseFragment
:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
var binding: VB? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = getViewBinding(view)
}
abstract fun getViewBinding(view: View): VB
}
class DemoFragment : BaseFragment<DemoFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//problem is here
binding.txtData.text="Something"
}
override fun getViewBinding(view: View): DemoFragmentBinding = DemoFragmentBinding.bind(view)
}
//Add this for the onCreateView implementation
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = DemoFragmentBinding.inflate(LayoutInflater.from(context), null, false)
val view = binding!!.root
return view
}
demo_fragment.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.fragments.DemoFragment">
<TextView
android:id="@+id/txt_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello" />
</FrameLayout>
我浏览了文档,不确定这是否会破坏
BaseFragment
中的抽象模式,但我用这个更改测试了您的代码,它成功了。只有DemoFragment
中发生了更改:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
var binding: VB? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = getViewBinding(view)
}
abstract fun getViewBinding(view: View): VB
}
class DemoFragment : BaseFragment<DemoFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//problem is here
binding.txtData.text="Something"
}
override fun getViewBinding(view: View): DemoFragmentBinding = DemoFragmentBinding.bind(view)
}
//Add this for the onCreateView implementation
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = DemoFragmentBinding.inflate(LayoutInflater.from(context), null, false)
val view = binding!!.root
return view
}
然后我在onViewCreated
中进行了测试:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//problem is here
binding?.txtData?.text="Something"
}
它成功了。我查看的文档是
我认为这样做仍然可以避免一些样板文件,但是由于视图绑定膨胀不同(例如,
DemoFragmentBinding.inflate等),每个片段都需要使用onCreateView
覆盖您需要重写BaseFragment中的onCreateView
,并初始化viewbinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = getViewBinding()
return binding.root
}
那就换这一行
override fun getViewBinding(view: View): DemoFragmentBinding = DemoFragmentBinding.bind(view)
与
基本片段:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
private var _binding: VB? = null
val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = getViewBinding()
return binding.root
}
abstract fun getViewBinding(): VB
}
class DemoFragment : BaseFragment<DemoFragmentBinding>() {
override fun getViewBinding() = DemoFragmentBinding.inflate(layoutInflater)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.apply {
txtData.text = "Something"
}
}
}
抽象类BaseFragment:Fragment(){
私有变量绑定:VB?=null
val binding get()=\u binding!!
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看{
_binding=getViewBinding()
返回binding.root
}
抽象趣味getViewBinding():VB
}
DemoFragment:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
private var _binding: VB? = null
val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = getViewBinding()
return binding.root
}
abstract fun getViewBinding(): VB
}
class DemoFragment : BaseFragment<DemoFragmentBinding>() {
override fun getViewBinding() = DemoFragmentBinding.inflate(layoutInflater)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.apply {
txtData.text = "Something"
}
}
}
class DemoFragment:BaseFragment(){
override fun getViewBinding()=DemoFragmentBinding.充气(LayoutFlater)
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
应用{
txtData.text=“某物”
}
}
}
你能显示片段的xml文件吗?@Amin更新了这个问题。这能回答你的问题吗?不,它不适用于包含的布局!我可以直接使用androidx.fragment:fragment ktx:1.2.0
在片段构造函数参数中传递demo_fragment.xml
,而不重写onCreateView,但我不想这样做!虽然谢谢你的回答。你说可以传递layout_文件是什么意思?传递layout xml并不会给你viewbinding。您需要使用DemoFragmentBinding.inflate(
method)专门充气。我已经更新了问题。