Разница между использованием пространств имен 'bind' и 'app' для установки пользовательского атрибута в Android DB? - PullRequest
0 голосов
/ 08 июня 2019

Рассмотрим следующий код:

переплетный адаптер:

@BindingAdapter("visibility")
fun setVisibility(view: View, shouldBeVisible: Boolean) {
    view.visibility = if (shouldBeVisible) View.VISIBLE else View.GONE
}

в чем разница между использованием bind пространства имен следующим образом:

<TextView
        android:id="@+id/text_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        bind:visibility="@{mainViewModel.showTextView}"/>

и использование app пространства имен, например:

<TextView
    android:id="@+id/text_view"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:text="Hello World!"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:visibility="@{mainViewModel.showTextView}"/>

они оба работают в моем коде.

1 Ответ

1 голос
/ 08 июня 2019

App Name-Space

Пространство имен приложения не является специфическим для библиотеки, но оно используется для всех атрибутов, определенных в вашем приложении, будь то ваш код или импортируемые вами библиотеки, эффективно создавая единое глобальное пространство имен для пользовательских атрибутов - т.е. атрибуты не определены по системе андроид.

В этом случае библиотека appcompat-v7 использует настраиваемые атрибуты, отражающие атрибуты android: namespace для поддержки предыдущих версий android (например: android: showAsAction был добавлен только в API11, но app: showAsAction (предоставляется как часть ваше приложение) работает на всех уровнях API вашего приложения) - очевидно, с использованием android: showAsAction не будет работать на уровнях API, где этот атрибут не определен.

  1. Bind

Bind используется для пользовательского установщика в привязке данных Android. Подробности смотрите ниже

Вам просто нужно аннотировать статический метод с помощью аннотации BindingAdapter. Эта аннотация принимает строку в качестве параметра. Строка - это пользовательский атрибут, с которым будет связан этот статический метод. Избегайте добавления пространства имен в параметр аннотации, так как это сделает привязку ненадежной. Первым параметром метода является объект View для примените функцию к, а вторым параметром будет значение, полученное из XML макета.

@BindingAdapter("progressColor")
public static void setProgressBarColor(ProgressBar loader, int color) {
  if (loader != null) {
    loader.getIndeterminateDrawable()
      .setColorFilter(color, android.graphics.PorterDuff.Mode.SRC_IN);
  }
}

Fore более подробно

<ProgressBar
  style="?android:attr/progressBarStyleLarge"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:indeterminate="true"
  bind:progressColor="@{@android:color/holo_green_dark}"
/>

Подробности о проверке связующего адаптера приведены ниже: https://developer.android.com/topic/libraries/data-binding/binding-adapters

...