android - ViewDataBinding getVariable?

标签 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>
  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 )。

下面是布局:

我的布局_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>

我的布局_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 种布局之一。

我的文本容器

<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运算符检查它是否是一个类型 MyLayoutBinding1 , MyLayoutBinding2MylayoutBinding3 .但正如我所说,这个用例仅用于演示目的,我可以有 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();

关于android - ViewDataBinding getVariable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37591320/

相关文章:

android - QT + OpenSSL + 安卓

android - 数据绑定(bind)布局约束

android - 尝试在 Android 的对话框中实现数据绑定(bind)

android - ObservableField 不传播更改

android - Kotlin “toString()” 在 Android 数据绑定(bind)中不可用

android - 为登录 Facebook : UIAutomator can't fill in text in Facebook's username field 的 Android 应用程序编写测试

android - YouTube API v3示例IllegalArgumentException,Android Studio

android - SherlockActionBar : How to adjust CustomView against actionBar

android - AppCompat v22 : Set default textcolor for TextView

android - Kotlin-DataBinding-错误 : Check your module classpath for missing or conflicting dependencies