Почему видимость DataBinding View не работает - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть следующая настройка DataBinding, но всякий раз, когда «isPrivate» имеет значение true, видимость остается View.GONE

layout.xml

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

<androidx.constraintlayout.motion.widget.MotionLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/scene_1">

    ... 

    <ImageView
        android:id="@+id/iv_car_private"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:src="@drawable/ic_lock"
        binding:visibility="@{viewModel.car.isPrivate}" />

   ...

</androidx.constraintlayout.motion.widget.MotionLayout>

<data>

    <variable
        name="viewModel"
        type="com.app.MyViewModel" />
</data>

</layout>

Activity

DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main).also { binding ->
    binding.lifecycleOwner = this
    binding.viewModel = myViewModel
}

BindingAdapter

@BindingAdapter("visibility")
fun setVisibility(view: View, isVisible: Boolean) {
    Timber.d("+++ isPrivate: $isVisible")
    view.visibility = if (isVisible) View.VISIBLE else View.GONE
}
  • @xml/scene_1 не ссылается на ImageView
  • Если удалитьbinding:visibility строка, вид виден
  • LogOutput в BindingAdapter всегда печатает правильные значения true / false
  • Я также пытался добавить binding.invalidateAll() в настройке Activity, но без разницы

ОБНОВЛЕНИЕ:

  • тот же BindingAdapter используется другим RecyclerView (его элементами) и работает
  • , если я подделываюПри использовании следующего BindingAdapter, imageResource установлен правильно (остальная часть кода идентична!)
    @BindingAdapter("isPrivate")
    fun setIsPrivate(imageView: ImageView, isPrivate: Boolean) {
        if (isPrivate) {
            imageView.setImageResource(R.drawable.ic_lock)
        } else {
            imageView.setImageDrawable(null)
        }
    }

1 Ответ

0 голосов
/ 28 сентября 2019

Можно связать boolean значения более просто с помощью троичного оператора:

android:visibility="@{viewModel.car.isPrivate ? View.GONE : View.VISIBLE}"

Вот как я обычно их раздуваю в Fragment (для fragment_main.xml):

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    this.mDataBinding = FragmentMainBinding.inflate(inflater, container, false);
    if (this.mDataBinding != null) {
        ...
    }
}

Фактическая прелесть привязки данных заключается в том, что их нужно сгенерировать, вместо того, чтобы записывать их - BindingAdapter требуется только для более сложных операций или определенные атрибуты не поддерживаются по умолчанию.

...