我在 Android 上玩 Kotlin,一件事讓我很困惑。
當我將幾個Fragments從 Java 轉換為 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()
}
}
我不能使binding不可為空,因為它必須在XFragment類建構式之后onCreateView()或之后初始化。
所以用這種方法,它必須是可以為空的,我必須把它放在!!任何地方。
有沒有辦法避免這些!!?
uj5u.com熱心網友回復:
官方檔案建議采用這種策略:
private var _binding: FragmentXBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
最終,它變得就像requireActivity()and 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)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/514411.html
標籤:安卓科特林android-viewbinding不可为空
