J'ai essayé de contrôler la visibilité d'une vue à l'aide des écouteurs d'attributs implicites ( référence ) dans Android liaison de données qui permet d'accéder aux vues par identifiant et d'accéder aux attributs comme vérifié , visible etc ..., cependant en essayant de l'utiliser, il lance une erreur comme ça
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}">
On dirait que les écouteurs d'attributs implicites utilisent le cas du chameau quand il est utilisé dans les expressions, grâce à cela post Je l'ai compris.
<!--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}">
Documenter pour ceux qui ont le même problème
Lorsque vous utilisez View.VISIBLE
/View.GONE
dans votre fichier .xml, vous devez importer le type View
en ajoutant <import type="Android.view.View"/>
dans la section des données, comme suit:
<data>
<import type="Android.view.View"/>
<variable
name="viewModel"
type="xx.xx.MyViewModel"/>
</data>
Étape 1 : créer 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);
}
}
}
Étape 2 : importez la classe R
dans la section de données de liaison de données layout.xml:
<data>
<import type="example.package.R"/>
</data>
Étape 3 : liez la vue personnalisée à votre commutateur comme ceci:
<Android.support.v7.widget.SwitchCompat
Android:id="@+id/addTodo_switch_remind"/>
<LinearLayout
Android:visibility="@{R.id.addTodo_switch_remind">