【问题标题】:Is there a smarter way to bind layouts to fragments?有没有更聪明的方法将布局绑定到片段?
【发布时间】:2021-06-16 16:37:33
【问题描述】:

我有一个片段的两个 XML 布局。代码必须在要绑定到的两个布局中进行选择。目前,这是我的代码。

这里,我声明了两个布局绑定。

private var bindingVariation: FragmentStartVariationBinding? = null
private var binding: FragmentStartBinding? = null

在 onCreateView 中,代码检查将要绑定到哪个布局。

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        if(sharedViewModel.discountEnabled.value == true){
            val fragmentBinding = FragmentStartVariationBinding.inflate(inflater, container, false)
            bindingVariation = fragmentBinding
            bindingVariation?.startFragment = this
            bindingVariation?.viewModel = sharedViewModel
            return fragmentBinding.root
        }else{
            val fragmentBinding = FragmentStartBinding.inflate(inflater, container, false)
            binding = fragmentBinding
            binding?.startFragment = this
            return fragmentBinding.root
        }
    }

这个 hack 目前有效,但如果我想在类中的其他地方调用绑定,我必须每次都检查它的绑定或绑定变化。

这段代码自然不起作用,但很好地说明了我想要实现的目标。

private var binding = setBinding()

fun setBinding(){
   var exampleBinding? = null
   if(sharedViewModel.discountEnabled.value == true){
      return exampleBinding: FragmentStartVariationBinding? = null
   }else{
      return exampleBinding: FragmentStartBinding? = null
   }
}

【问题讨论】:

  • 我个人的建议是你应该只制作两个不同的片段,每个片段都有自己合适的布局
  • 欢迎来到 Stack Overflow!是的@a_local_nobody 是对的,你应该有两个片段,并根据你的情况决定显示哪一个。

标签: android kotlin android-databinding


【解决方案1】:

最好的方案是为每个布局分开你的片段,但如果你需要在一个片段中处理多布局绑定,请这样做:

1 .声明你的多重绑定:

    lateinit var bindingLarge : FragmentProfileLargeScreenBinding
    lateinit var binding : FragmentProfileBinding

2 。分配他们:

    if (...) {
        bindingLarge = FragmentProfileLargeScreenBinding.inflate(layoutInflater)
        return R.layout.fragment_profile_large_screen
    }
    else {
        binding = FragmentProfileBinding.inflate(layoutInflater)
        return R.layout.fragment_profile
    }

3 .声明这样的视图:

fun getTextWithdrawal() : Button {
    return if(this::binding.isInitialized)
        binding.textWithdrawal
    else
        bindingLarge.textWithdrawal
}

4 .使用视图:

getTextWithdrawal().setOnClickListener {...}
getTextWithdrawal().visibility = View.Visible
getTextWithdrawal(). ...

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2020-05-17
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多