簡體   English   中英

Android:如何在基礎 class 中使用視圖綁定並從 kotlin 合成

[英]Android: How to use viewbinding in base class and migrate from kotlin synthetics

隨着kotlin synthetics的棄用,我遇到了一個問題,即我無法再從我的base class訪問一些標准布局。 例如,我有一個基礎 class 用於三個片段,並且在所有片段中都有一個按鈕。 我的舊方法是使用合成獲取基本 class 中的按鈕,然后分配一些默認的 clicklistener 等。

我的問題是:從合成遷移到視圖綁定/數據綁定的最佳方法是什么? 我問自己的另一個問題是,我現在如何訪問活動/片段之外的 view_layouts?

底座 class

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()
}

在 utils package 中訪問活動/片段之外的視圖

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM