2个主要问题是:
getVariable("variableName")
这样的方法来查找变量并返回该变量,如果不存在具有该名称的变量,则返回null。 因此,更明确地说:如果我不知道ViewDataBinding的类型,那么他们是获取其变量的一种方法还是我必须知道其类型?
实际上是这样的:
<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>
MyLayoutBinding binding = (MyLayoutBinding) DataBindingUtil.inflate(inflater, R.layout.my_layout, root, false);
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>
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运算符检查其类型为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");
很抱歉这篇(很长)的帖子,但是感谢您阅读它以及以后的回答!
最佳答案
我不确定是否能得到它,但是我要做的是在布局中声明一个变量,如下所示:
<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();