【问题标题】:Using View Binding with Fragments Android使用带有 Fragments Android 的视图绑定
【发布时间】:2021-11-08 12:08:54
【问题描述】:

我是 Android 新手。我正在通过制作应用程序来学习。我对视图与片段的绑定有一点疑问。 从official documentation,他们正在做这样的事情:

    class FragmentOne : Fragment() {

    private val tagLog = "FragmentOne"

    private var _binding: FragmentOneBinding? = null

    private val binding get() = _binding!!

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

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

        binding.button.setOnClickListener {
            Toast.makeText(
                requireActivity().applicationContext,
                "Button Clicked",
                Toast.LENGTH_SHORT
            ).show()
        }

        binding.tv.text = "Some Text"
    }

    override fun onDestroyView() {
        _binding = null
        Log.i(tagLog, "onDestroyView()")
        super.onDestroyView()
    }
}

有两个变量_binding和binding。但是,为什么我们不能只使用一个变量并做这样的事情:

class FragmentOne : Fragment() {

private val tagLog = "FragmentOne"

private var _binding: FragmentOneBinding? = null

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

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

    _binding?.button?.setOnClickListener {
        Toast.makeText(
            requireActivity().applicationContext,
            "Button Clicked",
            Toast.LENGTH_SHORT
        ).show()
    }

    _binding?.tv?.text = "Some Text"
}

override fun onDestroyView() {
    _binding = null
    Log.i(tagLog, "onDestroyView()")
    super.onDestroyView()
}
}

我运行了这段代码,它运行良好。如果我使用单个变量有什么问题吗?

【问题讨论】:

    标签: android android-fragments android-viewbinding


    【解决方案1】:

    直接使用_binding 也可以,如果你使用它而不是官方文档推荐的,也没有错。

    但官方文档建议使用带有下划线前缀的可空变量和不带前缀的不可空变量,以提高代码的可读性并避免重复的空检查。

    在一些链式操作中使用_binding 看起来像这样_binding?.first?.second?.third?.fourth?.someOperation(),另一方面,使用binding 模式将是binding.first.second.third.fourth.someOperation()。后一种代码比前一种更简洁。

    【讨论】:

    • 关于可读性的好解释,只是想知道为什么不使用lateinit var binding: FragmentOneBinding然后在onCreateView()内部初始化binding
    • @Tonnie lateinit 变量不能被分配null 并且对于片段中的viewbinding,我们必须摆脱bindingonDestroyView() 中的引用,否则会导致内存泄漏.
    • 我们现在清楚了。非常感谢您提供宝贵的信息。
    • @Praveen 感谢您花时间回答我的问题。现在,我明白了。
    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多