如何将 ViewBinding 与抽象基类一起使用

2024-01-09

我开始使用 ViewBinding。在搜索示例或一些建议后,我最终在这里发布了这个问题。

如何将 ViewBinding 与抽象基类一起使用,该基类处理预期出现在每个子布局中的视图上的相同逻辑?

设想:
我有一个基类public abstract class BaseFragment。有多个 Fragments 扩展了这个基类。这些片段具有从基类实现处理的通用视图(使用“旧”findViewById())。例如,每个片段的布局都应包含 ID 为 text_title 的 TextView。这是如何处理的BaseFragment's onViewCreated():

TextView title = view.findViewById(R.id.text_title);
// Do something with the view from the base class

现在,ViewBinding API 为每个子 Fragment 生成绑定类。我可以使用绑定引用视图,但无法使用基类中的具体绑定。即使我在基类中引入了泛型,片段绑定的类型也太多了,所以我暂时放弃了这个解决方案。

从抽象基类处理绑定视图的推荐方法是什么?有没有最佳实践?我没有在 API 中找到内置机制来以优雅的方式处理这种情况。

当预计子片段包含通用视图时,我可以提供抽象方法,从片段的具体绑定返回视图,并让它们可以从基类访问。 (例如protected abstract TextView getTitleView();)。但这是一个优势而不是使用findViewById()?还有其他(更好)的解决方案吗?


您好,我创建了一篇博客文章,其中深入介绍了视图绑定,还包括用于实现视图绑定的组合模式/委托模式以及使用链接中的继承签出

结帐完整代码BaseActivity and BaseFragment随着使用

????Androidbites|ViewBinding https://chetangupta.net/viewbinding/

/*
 * In Activity
 * source : https://chetangupta.net/viewbinding/
 * Author : ChetanGupta.net
 */
abstract class ViewBindingActivity<VB : ViewBinding> : AppCompatActivity() {

    private var _binding: ViewBinding? = null
    abstract val bindingInflater: (LayoutInflater) -> VB

    @Suppress("UNCHECKED_CAST")
    protected val binding: VB
        get() = _binding as VB

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = bindingInflater.invoke(layoutInflater)
        setContentView(requireNotNull(_binding).root)
        setup()
    }

    abstract fun setup()

    override fun onDestroy() {
        super.onDestroy()
        _binding = null
    }
}
/*
 * In Fragment
 * source : https://chetangupta.net/viewbinding/
 * Author : ChetanGupta.net
 */
abstract class ViewBindingFragment<VB : ViewBinding> : Fragment() {

    private var _binding: ViewBinding? = null
    abstract val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> VB

    @Suppress("UNCHECKED_CAST")
    protected val binding: VB
        get() = _binding as VB

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

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

    abstract fun setup()

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

对于使用,高级模式和反模式结帐博客Androidbites|ViewBinding https://chetangupta.net/viewbinding/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 ViewBinding 与抽象基类一起使用 的相关文章

随机推荐