ViewDataBinding getVariable?

MHo*_*gge 8 android android-databinding

两个主要问题是:

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

所以更明确一点:如果我不知道我的ViewDataBinding的类型,是他们获取变量的方法还是我必须知道它的类型?


以下是它的实际工作方式:

  1. 我有一个名为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>
Run Code Online (Sandbox Code Playgroud)
  1. 我给它的ViewDataBinding实例充气:

    MyLayoutBinding binding = (MyLayoutBinding) DataBindingUtil.inflate(inflater, R.layout.my_layout, root, false);  

  2. 我可以通过调用适当的方法来获取它的变量:

    String myVariable = binding.getMyVariable(); 

因此,这是如何让一个变量时,我们知道是什么类型的的ViewDataBinding.


我的问题在这里:

让我们想象一下我有3个布局叫my_layout_1,my_layout_2,my_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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

因此,不同的布局代表具有不同风格的文本(我知道它可以通过其他方式实现,但目标只是解释为什么我需要这个功能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>
Run Code Online (Sandbox Code Playgroud)

所以我会通过做这样的事情来添加文本(再次,它仅用于演示目的):

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));
Run Code Online (Sandbox Code Playgroud)

最后我想要检索,myVariable但我不知道它是否是布局1,2或3.基本上现在可以做的是使用instanceof运算符来检查它是否是一个类型MyLayoutBinding1,MyLayoutBinding2或者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"); 
Run Code Online (Sandbox Code Playgroud)

对于这个(非常)长的帖子感到抱歉,但感谢您阅读它以及将来的任何答案!

Rog*_*ris -1

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

<data>
    <variable
        name="variableName"
        type="bla.bla.VariableType"/>
</data>
Run Code Online (Sandbox Code Playgroud)

然后首先在 onCreate 中获取布局绑定:

binding = DataBindingUtil.inflate(inflater, R.layout.your_layout, container, false);
Run Code Online (Sandbox Code Playgroud)

然后您应该使用如下代码将变量发送到布局:

binding.setVariableName(yourVariable);
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样检索它:

binding.getVariableName();
Run Code Online (Sandbox Code Playgroud)

  • 否,因为绑定将被声明为 ViewDataBinding 而不是 MyLayoutDataBinding(它是 ViewDataBinding 的子级)。 (3认同)
  • 问题是我不知道我将获得哪个子 ViewDataBinding,因此它们将不会生成变量方法。但我知道,无论我得到什么 ViewDataBinding,我都会有一个同名的变量(假设为“foo”),所以我想要的是编写如下内容: ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout .your_layout, 容器, false); 绑定.getVariable(“foo”); 如果布局没有类似 &lt;data&gt; &lt;variable name="Foo" type="FooType"/&gt; &lt;/data&gt; 的内容,可能会抛出 NullPointerException (2认同)