I been trying to control the visibility of a view using the Implicit Attribute Listeners(reference) in android data binding which allows to access views by id and access attributes like checked, visible etc ..., however when trying to use this, it throws an error like so
Error:(119, 29) Identifiers must have user defined types from the XML file. addTodo_switch_remind is missing it
<android.support.v7.widget.SwitchCompat
android:id="@+id/addTodo_switch_remind"
style="@style/MediumTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/addTodo_space_project"
android:text="@string/add_todo_remind_label"
android:textOff="@string/generic_no_text"
android:textOn="@string/generic_yes_text" />
<android.support.v4.widget.Space
android:id="@+id/addTodo_space_remind"
style="@style/FormsSpacingStyle"
android:layout_below="@+id/addTodo_switch_remind" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/addTodo_space_remind"
android:orientation="vertical"
android:padding="@dimen/grid_box_single"
android:visibility="@{addTodo_switch_remind.checked ? View.VISIBLE : View.GONE}">
Looks like the implicit Attribute listeners use camel case when it is used in the expressions, thanks to this post I figured it out.
<!--Recurring Reminder -->
<android.support.v7.widget.SwitchCompat
android:id="@+id/addTodo_switch_remind"
style="@style/MediumTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/addTodo_space_project"
android:text="@string/add_todo_remind_label"
android:textOff="@string/generic_no_text"
android:textOn="@string/generic_yes_text" />
<android.support.v4.widget.Space
android:id="@+id/addTodo_space_remind"
style="@style/FormsSpacingStyle"
android:layout_below="@+id/addTodo_switch_remind" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/addTodo_space_remind"
android:orientation="vertical"
android:padding="@dimen/grid_box_single"
android:visibility="@{addTodoSwitchRemind.checked ? View.VISIBLE : View.GONE}">
Documenting for others who have the same issue
As you use View.VISIBLE
/ View.GONE
in your .xml file, you should import the View
type by doing adding <import type="android.view.View"/>
in the data section like the following:
<data>
<import type="android.view.View"/>
<variable
name="viewModel"
type="xx.xx.MyViewModel"/>
</data>
Step 1: create BindingAdapter:
@BindingAdapter("android:visibility")
public static void setVisibility(final View view, @IdRes int layourId) {
SwitchCompat switcher = (SwitchCompat)view.getRootView().findViewById(layourId)
switcher.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
view.setVisibility(isChecked ? View.VISIBLE : View.GONE);
}
}
}
Step 2: import R
class in databinding data section at you layout.xml:
<data>
<import type="example.package.R"/>
</data>
Step 3: bind custom view to your switcher like this:
<android.support.v7.widget.SwitchCompat
android:id="@+id/addTodo_switch_remind"/>
<LinearLayout
android:visibility="@{R.id.addTodo_switch_remind">
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With