Использование LiveData для настройки видимости TextView

Я хочу переключить видимость TextView с помощью LiveData. Было несколько других сообщений о настройке видимости с привязкой данных, но они используют Observables, тогда как я хочу использовать (более новые) LiveData. В частности, используйте LiveData.

Используя эта документация и несколько сообщений SO, я уже узнал, что вы должны правильно выровнять получатель вашего наблюдаемого (LiveData), чтобы тип возвращаемого значения соответствовал типу, ожидаемому установщиком для атрибута View, который вы хотите установить. Конкретно:

  • setVisibility () of View требует int, тогда как у меня есть член LiveData (так что получатель в моей ViewModel также вернет этот тип)
  • преобразование этого логического значения в View.VISIBLE и VIEW.GONE возможно с помощью тернарного оператора. Я также должен добавить safeUnbox () в свое XML-выражение, чтобы сделать его примитивным логическим

Используя эти идеи, в моем классе ViewModel я определил:

MutableLiveData<Boolean> textHintVisible;

После нажатия кнопки я устанавливаю это значение на False:

textHintVisible.postValue(false);

(обратите внимание, я также пробовал с setValue ())

Затем в свой XML-макет я включил:

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

Но все же мой TextView всегда виден. Для отладки я добавил наблюдателя в свою активность, и это подтверждает, что мое логическое значение правильно переключается между истиной и ложью:

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

Но мой TextView остается видимым все время. Что я делаю неправильно? Разве для этого нельзя использовать LiveData? Стоит ли использовать дополнительный конвертер? Или мой код в принципе правильный, но это ошибка в Android Studio? Любая помощь горячо приветствуется.

Я имею в виду одну вещь: вы установили привязку для наблюдения за liveData? Согласно документации developer.android.com/topic/libraries/data-binding/architect‌ ure вы должны установить макет привязки для наблюдения за жизненным циклом binding.setLifecycleOwner(this).

mlykotom 12.09.2018 20:34

Это действительно была проблема! Большое спасибо!

user3820186 14.09.2018 15:21

Я разместил его как ответ, так что вы можете принять его, и другие люди могут увидеть, что он решен, и найти ответ, а не только в комментариях :)

mlykotom 15.09.2018 16:43

Весь код, связанный с его переменной LiveData, был бы полезен. Вы упомянули, что «геттер в моей ViewModel также вернет этот тип, НО, преобразовав это логическое значение в View.VISIBLE, а VIEW.GONE можно использовать с помощью тернарного оператора». сообщает мне, что получатель может вернуть логическое значение, но тернарный преобразуется в int на месте, однако он, похоже, не работает, как описано. На самом деле нам просто не хватает метода getTextHintVisible ().

DevinM 04.12.2019 17:49
11
4
8 618
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я имею в виду одну вещь: вы установили привязку для наблюдения за liveData? В соответствии с документация вы должны установить макет привязки для наблюдения за жизненным циклом binding.setLifecycleOwner(this)

для фрагментов используйте binding.setLifecycleOwner(viewLifecycleOwner)

Francis 22.11.2018 19:54

@Francis Зачем нам использовать активность фрагмента в качестве владельца жизненного цикла? Разве весь смысл этого не в том, чтобы пользовательский интерфейс был привязан к жизненному циклу фрагмента, а не к действию, которое его удерживает? Предоставьте документацию, объясняющую ваш комментарий.

Shadow 21.03.2019 20:48

Вы не используете активность, в Fragment на самом деле есть 2 LifecycleOvwners - 1) сам фрагмент, 2) представление фрагмента. Поскольку экземпляр фрагмента не уничтожается после изменения ориентации, а только его представление, необходимо настроить жизненный цикл привязки на цикл представления, иначе могут произойти утечки памяти.

mlykotom 22.03.2019 11:03

Другие вопросы по теме