使用数据绑定设置视图可见性
Posted
技术标签:
【中文标题】使用数据绑定设置视图可见性【英文标题】:Use data binding to set View visibility 【发布时间】:2017-11-09 06:20:27 【问题描述】:尝试使用自定义变量设置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"/>
【问题讨论】:
参考Android Data Binding: visibility on include tag 【参考方案1】:如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"/>
【讨论】:
以及如何将值设置为“销售”? 那么您的意思是如何将值“sale”分配给字符串变量? 没错!我正面临问题。请分享我会比较然后让你知道。 该死!我多么怀念愚蠢的import。完成,谢谢。 嘿!知道为什么 position 在滚动时出现故障吗? Adapter【参考方案2】:在您的布局中:
<data>
<variable
name="viewModel"
type="...."/>
</data>
<View
android:layout_
android:layout_
android:visibility="@viewModel.saleVisibility, default=gone"/>
在您的 ViewModel java 代码中:
@Bindable
public int getSaleVisibility()
return mSaleIndecator ? VISIBLE : GONE;
【讨论】:
你让我免于轻微头痛 你的数据模型必须是 Observable 才能工作。 这对我有用没有包括@Bindable
。当我包括在内时,我遇到了不同的绑定错误,包括扩展BaseObservable
的建议。这里的好指针
必须是公认的答案!它对我来说非常有用!
对LiveData<Boolean>
有什么建议吗?【参考方案3】:
问题在于visibility
是Integer
类上的Integer
,这意味着您有两种方法可以完成这项工作:
-
使用
View.VISIBLE
和View.GONE
常量。 https://developer.android.com/topic/libraries/data-binding/index.html#imports
为visibility
定义一个自定义设置器,它采用Boolean
。 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"/>
工作。
【讨论】:
在您方便的地方,注解处理器会在编译期间自动检测它们。 谢谢,我把它放在我的BindingUtils.java中 但是如何设置价值销售? 如何将相同的方法应用于类似于Kiskae 解决方案。将此方法放在单独的文件中,例如 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_
android:layout_
android:visibility="@viewModel.number == 1" />
【讨论】:
以上是关于使用数据绑定设置视图可见性的主要内容,如果未能解决你的问题,请参考以下文章
如何为 ListView 的 ContextActions 的 MenuItem 添加可见性绑定