2个主要问题是:

  • 为什么ViewDataBinding没有像getVariable("variableName")这样的方法来查找变量并返回该变量,如果不存在具有该名称的变量,则返回null。
  • 他们是否有任何方法/解决方法来实现这种行为?

  • 因此,更明确地说:如果我不知道ViewDataBinding的类型,那么他们是获取其变量的一种方法还是我必须知道其类型?

    实际上是这样的:
  • 我有一个称为 my_layout.xml的布局:

  • <layout>
        <data>
            <variable
                android:name="myVaribale"
                android:type="String"/>
            </variable>
        </data>
    
        <RelativeLayout
            android:id="@+id/root_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="@{myVariable}"/>
    
        </RelativeLayout>
    <layout>
    
  • 我为其ViewDataBinding实例充气:
    MyLayoutBinding binding = (MyLayoutBinding) DataBindingUtil.inflate(inflater, R.layout.my_layout, root, false);  
  • 我可以通过调用适当的方法来获取其变量:
    String myVariable = binding.getMyVariable(); 

  • 因此,这就是当我们知道ViewDataBinding的类型时如何获取变量的方法。

    我的问题在这里:

    假设我有3个布局,分别称为my_layout_1my_layout_2my_layout_3,这3个布局被<layout>标记包围。
    这3个布局也具有相同的变量(myVariable)。

    所以这是布局:

    my_layout_1
    <layout>
    
        <data>
            <variable
                android:name="myVariable"
                android:type="String"/>
            </variable>
        </data>
    
        <RelativeLayout
            android:id="@+id/root_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="@{myVariable}"
                style="@style/my_style_1"/>
    
        </RelativeLayout>
    
    <layout>
    

    my_layout_2
    <layout>
    
        <data>
            <variable
                android:name="myVariable"
                android:type="String"/>
            </variable>
        </data>
    
        <RelativeLayout
            android:id="@+id/root_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="@{myVariable}"
                style="@style/my_style_2"/>
    
        </RelativeLayout>
    
    <layout>
    

    my_layout_3
    <layout>
    
        <data>
            <variable
                android:name="myVariable"
                android:type="String"/>
            </variable>
        </data>
    
        <RelativeLayout
            android:id="@+id/root_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="@{myVariable}"
                style="@style/my_style_3"/>
    
        </RelativeLayout>
    
    <layout>
    

    因此,不同的布局表示具有不同样式的文本(我知道可以通过其他方式实现,但是目的只是为了解释为什么我需要此函数getVariable(variableName)

    想象一下,现在我得到了一个名为my_text_container的布局,它将随机包含3个布局之一。

    my_text_container
    <layout>
    
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    <layout>
    

    因此,我将通过执行以下操作来添加文本(同样,这只是出于演示目的):
    MyTextContainerBinding textContainerBinding = (MyTextContainerBinding) DataBindingUtil.inflate(inflater, R.layout.my_text_container, root, false);
    int textLayoutRes;
    int randomNumber = generateNumberBetween0and2();
    switch(randomNumber) {
        case 0: textLayoutRes = R.layout.my_layout_1;
            break;
        case 1: textLayoutRes = R.layout.my_layout_2;
            break;
        case 2: textLayoutRes = R.layout.my_layout_3;
            break;
    }
    textContainerBinding.getRoot().addView(DataBindingUtil.inflate(inflater, textLayoutRes, root, false));
    

    最后,我想检索myVariable,但是我不知道它是布局1、2还是3。基本上,现在可以使用instanceof运算符检查其类型为MyLayoutBinding1MyLayoutBinding2还是MylayoutBinding3。但是正如我所说的,该用例仅用于演示目的,我可以有999种不同的布局。

    所以我想做的是:
    ViewDataBinding myLayout = DataBindingUtil.getBinding(textContainerBinding.getRoot().getChildAt(0));
    String myVariable = myLayout.getVariable("myVariable");
    
    if(myVariable != null)
        Log.d(TAG, "myLayout was MylayoutBinding1 or myLayoutBinding2 or myLayoutBinding3");
    else
        Log.d(TAG, "mylayout was not one of the 3 layouts");
    

    很抱歉这篇(很长)的帖子,但是感谢您阅读它以及以后的回答!

    最佳答案

    我不确定是否能得到它,但是我要做的是在布局中声明一个变量,如下所示:

    <data>
        <variable
            name="variableName"
            type="bla.bla.VariableType"/>
    </data>
    

    然后首先在onCreate中获得布局绑定(bind):
    binding = DataBindingUtil.inflate(inflater, R.layout.your_layout, container, false);
    

    然后,您应使用以下代码将变量发送到布局:
    binding.setVariableName(yourVariable);
    

    然后,您可以像这样检索它:
    binding.getVariableName();
    

    10-07 13:00