使用数据绑定设置视图可见性
Use data binding to set View visibility
正在尝试使用自定义变量设置 View
的可见性,但出现错误:Identifiers must have user defined types from the XML file. visible is missing it
。是否可以使用数据绑定设置视图可见性?谢谢
<data>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? visible : gone}"/>
问题是 visibility
是 View
class 上的 Integer
,这意味着您有两种方法可以完成这项工作:
- 使用
View.VISIBLE
和 View.GONE
常量。 https://developer.android.com/topic/libraries/data-binding/index.html#imports
- 为采用
Boolean
的 visibility
定义自定义 setter。 https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters
可能的实现:
@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
view.setVisibility(value ? View.VISIBLE : View.GONE);
}
这将使 <FrameLayout android:visibility="@{sale}"/>
工作。
如Android Developer Guide中所述,您需要这样做:
<data>
<import type="android.view.View"/>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
在您的布局中:
<data>
<variable
name="viewModel"
type="...."/>
</data>
<View
android:layout_width="10dp"
android:layout_height="10dp"
android:visibility="@{viewModel.saleVisibility, default=gone}"/>
在您的 ViewModel java 代码中:
@Bindable
public int getSaleVisibility(){
return mSaleIndecator ? VISIBLE : GONE;
}
类似于解决方案。将此方法放在单独的文件中,例如 Bindings.kt:
@BindingAdapter("android:visibility")
fun View.bindVisibility(visible: Boolean?) {
isVisible = visible == true
// visibility = if (visible == true) View.VISIBLE else View.GONE
}
然后在布局中XML:
<data>
<variable
name="viewModel"
type="SomeViewModel" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{viewModel.number == 1}" />
正在尝试使用自定义变量设置 View
的可见性,但出现错误:Identifiers must have user defined types from the XML file. visible is missing it
。是否可以使用数据绑定设置视图可见性?谢谢
<data>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? visible : gone}"/>
问题是 visibility
是 View
class 上的 Integer
,这意味着您有两种方法可以完成这项工作:
- 使用
View.VISIBLE
和View.GONE
常量。 https://developer.android.com/topic/libraries/data-binding/index.html#imports - 为采用
Boolean
的visibility
定义自定义 setter。 https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters
可能的实现:
@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
view.setVisibility(value ? View.VISIBLE : View.GONE);
}
这将使 <FrameLayout android:visibility="@{sale}"/>
工作。
如Android Developer Guide中所述,您需要这样做:
<data>
<import type="android.view.View"/>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
在您的布局中:
<data>
<variable
name="viewModel"
type="...."/>
</data>
<View
android:layout_width="10dp"
android:layout_height="10dp"
android:visibility="@{viewModel.saleVisibility, default=gone}"/>
在您的 ViewModel java 代码中:
@Bindable
public int getSaleVisibility(){
return mSaleIndecator ? VISIBLE : GONE;
}
类似于
@BindingAdapter("android:visibility")
fun View.bindVisibility(visible: Boolean?) {
isVisible = visible == true
// visibility = if (visible == true) View.VISIBLE else View.GONE
}
然后在布局中XML:
<data>
<variable
name="viewModel"
type="SomeViewModel" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{viewModel.number == 1}" />