Я хочу переключить видимость TextView с помощью LiveData. Было несколько других сообщений о настройке видимости с привязкой данных, но они используют Observables, тогда как я хочу использовать (более новые) LiveData. В частности, используйте LiveData.
Используя эта документация и несколько сообщений SO, я уже узнал, что вы должны правильно выровнять получатель вашего наблюдаемого (LiveData), чтобы тип возвращаемого значения соответствовал типу, ожидаемому установщиком для атрибута View, который вы хотите установить. Конкретно:
Используя эти идеи, в моем классе 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, был бы полезен. Вы упомянули, что «геттер в моей ViewModel также вернет этот тип, НО, преобразовав это логическое значение в View.VISIBLE, а VIEW.GONE можно использовать с помощью тернарного оператора». сообщает мне, что получатель может вернуть логическое значение, но тернарный преобразуется в int на месте, однако он, похоже, не работает, как описано. На самом деле нам просто не хватает метода getTextHintVisible ().
Я имею в виду одну вещь: вы установили привязку для наблюдения за liveData? В соответствии с документация вы должны установить макет привязки для наблюдения за жизненным циклом binding.setLifecycleOwner(this)
для фрагментов используйте binding.setLifecycleOwner(viewLifecycleOwner)
@Francis Зачем нам использовать активность фрагмента в качестве владельца жизненного цикла? Разве весь смысл этого не в том, чтобы пользовательский интерфейс был привязан к жизненному циклу фрагмента, а не к действию, которое его удерживает? Предоставьте документацию, объясняющую ваш комментарий.
Вы не используете активность, в Fragment на самом деле есть 2 LifecycleOvwners - 1) сам фрагмент, 2) представление фрагмента. Поскольку экземпляр фрагмента не уничтожается после изменения ориентации, а только его представление, необходимо настроить жизненный цикл привязки на цикл представления, иначе могут произойти утечки памяти.
Я имею в виду одну вещь: вы установили привязку для наблюдения за liveData? Согласно документации developer.android.com/topic/libraries/data-binding/architect ure вы должны установить макет привязки для наблюдения за жизненным циклом
binding.setLifecycleOwner(this).