【发布时间】:2016-10-02 03:49:00
【问题描述】:
两个主要问题是:
- 为什么 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_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");
很抱歉这篇(非常)长的帖子,但感谢您阅读它以及任何未来的答案!
【问题讨论】:
-
从 Java 的角度来看,正确的答案是让您能够请求所有三个
MyLayoutBinding...类都实现一个公共接口,其中您有您的getMyVariable()。我看不出这在哪里是一个选项,尽管您可以提交一个功能请求。 -
当您通过设置
textLayoutRes决定要膨胀的布局时,您已经知道您选择了哪个布局。当您已经了解膨胀的布局文件时,我找不到您想要额外的getMyVariable()的任何理由。由于布局文件不能是动态的,因此您将始终知道您拥有多少个布局。而且您必须对它们进行强制转换并为每个布局绑定设置变量。所以问题仍然不清楚你想要实现什么。我建议你,为了得到更好的答案,发布实际问题并解释你为什么需要这个。 -
谷歌真的应该添加这个功能。
标签: android android-databinding