Reputation: 5418
Trying to set visibility of View
using custom variable, but error occurs: Identifiers must have user defined types from the XML file. visible is missing it
. Is it possible to set view visibility using data binding? Thanks.
<data>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? visible : gone}"/>
Upvotes: 144
Views: 115768
Reputation: 28793
Similar to Kiskae solution. Put this method in a separate file, for instance, Bindings.kt:
@BindingAdapter("android:visibility")
fun View.bindVisibility(visible: Boolean?) {
isVisible = visible == true
// visibility = if (visible == true) View.VISIBLE else View.GONE
}
Then in layout XML:
<data>
<variable
name="viewModel"
type="SomeViewModel" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{viewModel.number == 1}" />
Upvotes: 5
Reputation: 4402
As stated in the Android Developer Guide, you need to do it like this:
<data>
<import type="android.view.View"/>
<variable
name="sale"
type="java.lang.Boolean"/>
</data>
<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
Upvotes: 348
Reputation: 842
In your layout:
<data>
<variable
name="viewModel"
type="...."/>
</data>
<View
android:layout_width="10dp"
android:layout_height="10dp"
android:visibility="@{viewModel.saleVisibility, default=gone}"/>
In your ViewModel java code:
@Bindable
public int getSaleVisibility(){
return mSaleIndecator ? VISIBLE : GONE;
}
Upvotes: 70
Reputation: 25573
The problem is that visibility
is an Integer
on the View
class, this means you have two ways to make this work:
View.VISIBLE
and View.GONE
constants. https://developer.android.com/topic/libraries/data-binding/index.html#importsvisibility
that takes a Boolean
. https://developer.android.com/topic/libraries/data-binding/index.html#custom_settersPossible implementation:
@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
view.setVisibility(value ? View.VISIBLE : View.GONE);
}
Which will make <FrameLayout android:visibility="@{sale}"/>
work.
Upvotes: 53