web-dev-qa-db-fra.com

Utilisation de LiveData pour définir la visibilité de TextView

Je souhaite basculer la visibilité d'un TextView à l'aide de LiveData. Il y a eu quelques autres articles sur la définition de la visibilité avec la liaison de données, mais ceux-ci utilisent Observables, alors que je veux tirer parti du (plus récent) LiveData. Utilisez en particulier un LiveData.

En utilisant cette documentation , et quelques SO posts, j'ai déjà appris que vous devez aligner correctement votre getter de votre observable (LiveData) afin que le type de retour corresponde au type attendu par le setter pour l'attribut View que vous souhaitez définir. Plus précisément:

  • setVisibility () de View nécessite un int, alors que j'ai un membre LiveData (donc le getter dans mon ViewModel retournera également ce type)
  • la conversion de ce booléen en View.VISIBLE et VIEW.GONE est possible en utilisant un opérateur ternaire. Je devrais également ajouter safeUnbox () dans mon expression XML pour en faire un booléen primitif

En utilisant ces informations, dans ma classe ViewModel, j'ai défini:

MutableLiveData<Boolean> textHintVisible;

Après avoir appuyé sur un bouton, j'ai défini cette valeur sur False:

textHintVisible.postValue(false);

(note, j'ai aussi essayé avec setValue ())

Ensuite, dans ma mise en page XML, j'ai inclus:

<TextView
   Android:visibility="@{(safeUnbox(viewModel.textHintVisible) ? View.VISIBLE : View.GONE)}"
/>

Mais quand même, mon TextView est toujours visible. Pour déboguer, j'ai ajouté un observateur dans mon activité, ce qui confirme que mon booléen est correctement basculé entre vrai et faux:

mHintsViewModel.getTextHintVisible().observe(this, new Observer<Boolean>() {
   @Override
   public void onChanged(@Nullable Boolean newInt) {
        Log.i(TAG,"onChanged: "+newInt);
   }
});

Mais mon TextView reste visible tout le temps. Qu'est-ce que je fais mal? Est-il impossible d'utiliser LiveData pour cela? Dois-je utiliser un convertisseur supplémentaire? Ou mon code est-il en principe correct, mais est-ce un bug dans Android Studio? Toute aide est très appréciée.

10
user3820186

Une chose que j'ai à l'esprit est - avez-vous défini votre liaison pour observer liveData? Selon documentation vous devez définir la disposition de liaison pour observer le cycle de vie binding.setLifecycleOwner(this)

14
mlyko