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()或之后)进行初始化。
因此,通过这种方法,它必须可以为空,并且我必须将其放在!!任何地方。
有什么方法可以避免这些!!吗?
官方文档建议了这个策略:
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)
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |