2016-11-28 5 views
15

Это должно быть самым основным вопросом, но после целого дня чтения учебников и документации here Я не могу понять, где именно эти методы. Ни один из руководств не упоминает, где находится эта вещь, она просто упоминает об использовании аннотации статического метода. Какой статический метод? Любой статический метод вообще независимо от класса? Что такое хорошая практика? создать класс CustomBinding для размещения всех этих статических методов?Где разместить метод Android BindingAdapter?

До тех пор, пока у меня есть метод с аннотацией BindingAdapter, и первым параметром является вид, он будет работать?

Я предполагаю, что если первый параметр имеет тип View, я могу поместить атрибут привязки для любого типа представлений, и он вызовет метод? Итак, если у меня есть конкретное представление, скажем, EditText, значит ли это, что метод вызывается только тогда, когда атрибут найден в представлении EditText в файле макета?

+1

посмотреть, как это делается с уже существующими адаптерами, такими как [TextViewBindingAdapter] (https://android.googlesource.com/platform/frameworks/data-binding/+/android-6.0.0_r7/extensions/baseAdapters/src/ главная/java/android/привязка/адаптеры/TextViewBindingAdapter.java) и [родительская папка] (https://android.googlesource.com/platform/frameworks/data-binding/+/android-6.0.0_r7/extensions/baseAdapters/ src/main/java/android/databinding/adapters) – pskink

ответ

11

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

Quote:

переплет адаптеров аннотированных метод любого класса, которые используются, чтобы сделать именно это. Как правило, вы настраиваете свои адаптеры в классы [-a] на основе целевого типа View.

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

1

Вы размещаете его в своем классе модели.

Пример:

XML:

<data> 

    <variable 
     name="item" 
     type="com.yourpackage.Model"/> 
     </data> 
     ...... 

      <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@{item.resId}"/> 

Модель:

public class Model { 

@DrawableRes 
private final int resId; 

public Model(int resId) { 
    this.resId = resId; 
} 

public int getResId() { 
    return resId; 
} 

@BindingAdapter ("android:src") 
public static void setImageResource(ImageView imageView, int resource){ 
    imageView.setImageResource(resource); 
} 

}

+0

Пожалуйста, объясните, является ли это единственным способом сделать это или это ваш путь? Есть несколько BindingAdapters, которые сгруппированы в классе, например https://android.googlesource.com/platform/frameworks/data-binding/+/android-6.0.0_r7/extensions/baseAdapters/src/main/java/android/ databinding/adapters/TextViewBindingAdapter.java – chaser

+2

Я не думаю, что класс модели не является хорошим местом для размещения этого BindingAdapter, потому что он не предназначен для связи с моделью. Например, я не могу сделать два '@BindingAdapter (« android: src »)' - один для масштабирования изображения до 200x200, а другой - для масштабирования изображения до 400x400. Я думаю, что было бы лучше помещать их в класс специально для привязки (например, 'BindingAdapterUtils'). – Sam

+0

@ У вас есть идея при использовании Binding Adapter без пользовательских представлений? Я попытался привести в другой файл, но не знаю, как его поместить в тег – TruongHieu