J'essaye de masquer / afficher dynamiquement un élément dans mes vues, donc j'ai suivi cet exemple Active / désactive la visibilité des éléments de mise en page avec la liaison de données Android.

J'utilise

  • Android Studio 2.3.1
  • compileSdkVersion 23
  • buildToolsVersion '25 .0.2 '
  • minSdkVersion 15
  • targetSdkVersion 17

Mon premier problème est le message d'erreur "L'espace de noms Android manque à l'attribut", mais tous les exemples que je peux trouver ne fournissent pas l'espace de noms

enter image description here

Néanmoins j'ai essayé de démarrer mon projet et obtenir une autre erreur:

android:visibility="@{@bool/list_show_icon ? View.VISIBLE : View.GONE}"

Error:(22, 29) No resource found that matches the given name (at 'visibility' with value '@{@bool/list_show_icon ? View.VISIBLE : View.GONE}').

Il semble qu'il n'essaye pas d'évaluer l'expression

1
wutzebaer 20 avril 2017 à 10:30

3 réponses

Meilleure réponse

Ajoutez votre racine LinearLayout à l'intérieur de la balise layout

<layout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:app="http://schemas.android.com/apk/res-auto">

  <data>
     <import type="android.view.View"/>
  </data>
  <LinearLayout>
  </LinearLayout>
</layout>
1
Kishore Jethava 20 avril 2017 à 07:51

La première règle d'utilisation de DataBinding est que votre élément racine de XML doit être <layout>

Fait partie de <layout>, pas d'autres mises en page. Dans votre cas, cela devrait être

<layout>
    <data> </data>
    <LinearLayout>

    </LinearLayout>
</layout>
0
Ravi 20 avril 2017 à 07:53

Comme Kishore l'a déjà écrit.

Doit être l'élément racine et envelopper l'ensemble de votre mise en page + données.

Ses

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
  <data>
      <import type="android.view.View" />
  </data>
 <LinearLayout  
       android:layout_width="match_parent" 
       android:layout_height="match_parent"
       android:background="?android:attr/activatedBackgroundIndicator"
       android:minHeight="56dp"
       android:orientation="horizontal"
       android:paddding="8dp">
  </LinearLayout>
</layout>

Quoi qu'il en soit, si vous utilisez la liaison de données, je recommande d'utiliser un booléen / entier observable au lieu d'utiliser la logique de visibilité dans la mise en page. Cela peut être résolu en utilisant un ViewModel comme

 <data>
     <variable name="viewModel" type="YourViewModelClass" />
 </data>

 <LinearLayout> ... <TextView android:visibility="@{viewModel.isVisible}" />
 </LinearLayout>

Et en utilisant dans votre ViewModel (mvvm):

 private boolean ObservableInt isVisible = new ObservableInt(View.GONE);
 private void changeVisibility(boolean visible) { isVisible.set( visible ? View.VISIBLE : View.Gone); }

C'est juste plus propre mais n'affecte pas les performances ou quoi que ce soit.

0
Emanuel S 20 avril 2017 à 08:08