【问题标题】:Android: Assign different layout files to a variable ViewBinding object?Android:将不同的布局文件分配给变量 ViewBinding 对象?
【发布时间】:2021-06-08 08:18:38
【问题描述】:

是否可以有条件地将不同的布局文件附加到同一个视图绑定对象?

例如,我在片段中定义了一个通用视图绑定对象,如下所示:

private lateinit var binding: ViewBinding

然后在 onCreateView 中,我根据这样传递的值进行设置:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    if (savedInstanceState != null) {
        settingsVisible = savedInstanceState.getBoolean(Constants.SETTIGNS_VISIBILITY_KEY, false)
    }
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_style_horizontal, container,
            false) as FragmentStyleHorizontalBinding
    if(activity != null) {
        val args = arguments
        val isHorz = args?.getBoolean("isHorizontalLayout")
        isHorz?.let {
             if(!it){
                 binding = DataBindingUtil.inflate(inflater, R.layout.fragment_style, container,
                         false) as FragmentStyleBinding
            }
        }
    }
    setupViews();
    return binding.root
}

这可能吗?我无法以这种方式访问​​视图,并且我不想创建两个不同的视图绑定对象以避免重复代码两次用于具有点击侦听器的视图。

【问题讨论】:

  • 我猜你可以做到。要访问特定视图,首先将绑定强制转换为该特定布局,然后访问子视图。

标签: android android-databinding android-viewbinding


【解决方案1】:

我能想到的唯一方法是您保留为其设置视图的标志的布尔值,或者您只能检查 instanceOf(在 kotlin 中将是 is),并相应地转换 ViewBinding对象在使用前实际绑定类。

这可能会变得一团糟所以如果你的用例允许你创建两个单独的Fragments 会更好。或者您可以将两个视图放在相同的布局中,您可以根据需要更改可见性。

【讨论】:

    【解决方案2】:
            private lateinit var binding1: conditionOneLayout
     private lateinit var binding2: conditionTwoLayout
    
        
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            if(condition_one())
                binding1 =  DataBindingUtil.inflate(inflater, R.layout.condition_one_layout, container, false)
            else if(condition_two())
                binding2 =  DataBindingUtil.inflate(inflater, R.layout.condition_two_layout, container, false)
    
        .
        .
        .
     if(condition_one()){
            return binding1.root
    }
    else{
     return binding2.root
    }
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2014-06-29
      • 2016-09-18
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多