android - 如何使用 View 绑定(bind)制作 BaseFragment

标签 android kotlin androidx android-jetpack android-viewbinding

我的 基 fragment :

abstract class BaseFragment<ViewModel : BaseViewModel, Binding : ViewBinding> : Fragment() {

    protected abstract val viewModel: ViewModel
    private var _binding: Binding? = null
    protected val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        _binding = Binding.inflate(inflater, container, false) //This line not working
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        initialize()
        setupListeners()
        observe()
    }

    abstract fun initialize()

    abstract fun setupListeners()

    abstract fun observe()

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
但是这条线不起作用_binding = Binding.inflate(inflater, container, false)有一个工作代码,但对我来说这是狗屎编码:
abstract class BaseFragment<ViewModel : BaseViewModel, T : ViewBinding>() : Fragment() {

    private var _binding:T? = null
    protected abstract val viewModel: ViewModel
    protected val binding get() = _binding!!


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        val superclass: Type = javaClass.genericSuperclass!!
        val aClass = (superclass as ParameterizedType).actualTypeArguments[1] as Class<*>
        try {
            val method: Method = aClass.getDeclaredMethod(
                "inflate",
                LayoutInflater::class.java,
                ViewGroup::class.java,
                Boolean::class.javaPrimitiveType
            )
            _binding = method.invoke(null, layoutInflater, container, false) as T

        } catch (e: Exception) {
            e.printStackTrace()
        }
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initialize()
        setupListeners()
        observe()
    }

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

    abstract fun initialize()

    abstract fun setupListeners()

    abstract fun observe()
}
如何正确地做任何人都有一个干净的解决方案。我知道 数据绑定(bind) 有 DataBindingUtil 但我需要 View 绑定(bind) . 有类似的东西吗? View 绑定(bind)
我希望你的答案
.
编辑
图书馆: https://github.com/kirich1409/ViewBindingPropertyDelegate
基本 fragment :
abstract class BaseFragment<ViewModel : BaseViewModel, Binding : ViewBinding>(
    layoutID: Int
) : Fragment(layoutID) {

    protected abstract val viewModel: ViewModel
    protected abstract val binding: Binding

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        setupViews()
        setupListeners()
        setupObservers()
    }

    abstract fun setupViews()

    abstract fun setupListeners()

    abstract fun setupObservers()
}
class Fragment : BaseFragment<BaseViewModel, FragmentBinding>(
    R.layout.fragment
) {

    override val viewModel: BaseViewModel by viewModels()
    override val binding: FragmentBinding by viewBinding() // this is from library

    override fun setupViews() {
      
    }

    override fun setupListeners() {

    }

    override fun setupObservers() {
        
    }
}

最佳答案

BaseFragment.kt

typealias Inflate<T> = (LayoutInflater, ViewGroup?, Boolean) -> T

abstract class BaseFragment<VB: ViewBinding>(
        private val inflate: Inflate<VB>
) : Fragment() {
    
    private var _binding: VB? = null
    val binding get() = _binding!!

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

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
HomeFragment.kt
class HomeFragment() : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.homeText.text = "Hello view binding"
    }
}

关于android - 如何使用 View 绑定(bind)制作 BaseFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64819181/

相关文章:

android - 什么是 AndroidX.Test 框架,它如何影响我的单元/robolectric/espresso 测试?

android - 构建失败并出现错误 : expected reference but got (raw string) #000000

kotlin - 如何在同步上下文中使用箭头 kt 中的 IO 组合

android - takePicture 需要 CameraX (1.0.0-alpha06) 上的执行器

android - "Uploaded a Debuggable APK"至 Google Play

java - Android/Java : how to send notifications to user,,即使应用程序未使用 "actively"?

java - NullPointerException:键== null ||值==空

android - NotificationCompat android - 如何只显示大图标而不显示小图标

kotlin - 如何使用短格式覆盖属性 setter ?

android - 我对登录到远程服务器的 Repository 类的单元测试有多有效?