![](/img/trans.png)
[英]TextView issues after migrate from Kotlin synthetics to Jetpack view binding
[英]Android: How to use viewbinding in base class and migrate from kotlin synthetics
隨着kotlin synthetics
的棄用,我遇到了一個問題,即我無法再從我的base class
訪問一些標准布局。 例如,我有一個基礎 class 用於三個片段,並且在所有片段中都有一個按鈕。 我的舊方法是使用合成獲取基本 class 中的按鈕,然后分配一些默認的 clicklistener 等。
我的問題是:從合成遷移到視圖綁定/數據綁定的最佳方法是什么? 我問自己的另一個問題是,我現在如何訪問活動/片段之外的 view_layouts?
abstract class BaseRebuildFragment(layout: Int) : Fragment(layout) {
abstract val nextFragment: NavDirections
abstract val baseViewModel: ViewModel
open val dataOverViewFragment: Boolean = false
@Inject @RebuildProgressDescription lateinit var progressBarDescription: ArrayList<String>
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initAppStandardToolbar()
initStateProgressBar(progressBarDescription)
initButton()
hideBottomNav()
}
private fun initButton() {
calibrate_btn_next.setOnClickListener { // not working anymore
if (dataOverViewFragment) return@setOnClickListener else if (this.validForm()) findNavController().navigate(nextFragment)
}
}
open fun validForm(): Boolean { return false }
}
@AndroidEntryPoint
class RebuildOptionFragment : BaseRebuildFragment(R.layout.fragment_rebuild_option) {
override val baseViewModel: RebuildViewModel by navGraphViewModels(R.id.nav_send_rebuild) { defaultViewModelProviderFactory }
private val rebuildBinding: FragmentRebuildOptionBinding by viewBinding()
override val nextFragment: NavDirections = RebuildOptionFragmentDirections.actionRebuildOptionFragmentToRebuildUserDataFragment()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
bindObjects()
baseViewModel.setStateEvent(RebuildStateEvent.GetPrice)
subscribeRebuildListObserver()
}
private fun bindObjects() = with(rebuildBinding) {
viewModel = baseViewModel
lifecycleOwner = viewLifecycleOwner
lendingListener = LendingSwitch()
}
override fun validForm(): Boolean = baseViewModel.shippingValidator.isShippingOptionsValid()
}
fun Fragment.initStateProgressBar(progressBarDescription: ArrayList<String>) = with(app_standard_progress_bar) { // not working anymore
setStateDescriptionData(progressBarDescription)
}
fun Fragment.initAppStandardToolbar() {
toolbar.setupWithNavController(findNavController(), AppBarConfiguration(findNavController().graph)) // not working anymore
}
findViewById
可以直接使用,而不是使用合成來完成同樣的事情,但沒有類型安全。 您必須提供類型,因為它無法推斷類型。
fun Fragment.initStateProgressBar(progressBarDescription: ArrayList<String>) = with(requireView().findViewById<ProgressBar>(R.id.app_standard_progress_bar)) {
setStateDescriptionData(progressBarDescription)
}
使用視圖綁定,您應該使用生成的綁定 class 自己膨脹布局 - 所以對於R.layout.fragment_rebuild_option
它應該是FragmentRebuildOptionBinding
。
在onCreateView
中,調用 class 上的inflate
選項:
binding = FragmentRebuildOptionBinding.inflate(inflater, container, false)
// return the root layout view
return binding.root
這會創建一個綁定 object ,它具有您所有的View
引用作為屬性,就像您使用合成物一樣 - 所以諸如binding.calibrate_btn_next
之類的東西。 這意味着binding
需要是Fragment
class 中的成員變量,因此您的所有函數都可以訪問它。
然后基本上只是將所有代碼更改為引用binding.whatever
而不是隨便whatever
對於在沒有任何類型安全性的情況下訪問的動態視圖,您可以像往常一樣使用findViewById
。
要訪問 Fragment 中的視圖,您可以使用requireView()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.