Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带viewbinding的BaseFragment_Android_Kotlin_Android Mvvm_Android Viewbinding - Fatal编程技术网

Android 带viewbinding的BaseFragment

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

要在android应用程序中使用
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)专门充气。我已经更新了问题。