当我在 Kotlin 中使用 Android 视图绑定时,我可以在任何地方避免使用 `!!` 吗?

Kam*_*mil 0 android non-nullable kotlin android-viewbinding

我正在 Android 上使用 Kotlin,有一件事让我感到困惑。

当我将一些FragmentsJava 转换为 Kotlin 时,我得到了这个:

class XFragment : Fragment() {
    
    private var binding: FragmentXBinding? = null

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

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding!!.slPower.addOnChangeListener(this)
        binding!!.btnClearTagList.setOnClickListener(this)
    }

    // ...

    private fun updateUi(){
        binding!!.someTextView.text = getSomeTextViewText()
        binding!!.someSlider.value = getSomeSliderValue()
    }

}
Run Code Online (Sandbox Code Playgroud)

我无法使其binding不可为空,因为它必须XFragment在类构造函数之后(onCreateView()或之后)进行初始化。

因此,通过这种方法,它必须可以为空,并且我必须将其放在!!任何地方。

有什么方法可以避免这些!!吗?

Ten*_*r04 6

官方文档建议了这个策略:

private var _binding: FragmentXBinding? = null

// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
Run Code Online (Sandbox Code Playgroud)

最终,它变得就像requireActivity()requireContext()。您只需要记住不要在可能在视图生命周期之外调用的回调中使用它。

请注意,您可以使用超级构造函数布局参数创建视图,然后绑定到onViewCreated. 那么您甚至可能不需要将其放在房产中。我很少需要在外部对它做任何事情,onViewCreated()并且直接由它调用函数:

class XFragment : Fragment(R.layout.fragment_x) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val binding = FragmentXBinding.bind(view)
        binding.slPower.addOnChangeListener(this)
        binding.btnClearTagList.setOnClickListener(this)
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 类似的替代方案:使用 https://github.com/Zhuinden/fragmentviewbindingdelegate-kt (2认同)