2016-09-02 9 views
9

Widziałem DataBindingComponent w oficjalnym dokumencie API.Co to jest klasa "DataBindingComponent" w Androidach?

https://developer.android.com/reference/android/databinding/DataBindingUtil.html

Interfejs ten jest generowany podczas opracowywania zawierać pobierające dla używane BindingAdapters np. Gdy obiekt BindingAdapter jest metodą instancji , instancja klasy implementującej metodę musi być instancją instancji klasy . Ten interfejs zostanie wygenerowany z modułem pobierającym dla dla każdej klasy z nazwą get * where * jest prostą nazwą klasy klasy deklarującej klasę/interfejs BindingAdapter. Kolizje nazw zostaną zmienione na przez dodanie przyrostka liczbowego do gettera.

Instancja tej klasy może również zostać przekazana do statycznego obiektu lub instancji BindingAdapters jako pierwszy parametr.

Jeśli używasz Dagger 2, programista powinien rozszerzyć ten interfejs i opisać rozszerzony interfejs jako komponent.

Nie mogę jednak znaleźć żadnego przykładu użycia tej klasy w Internecie. Czy ktokolwiek wie, co to jest i jak z niego korzystać.

Próbowałem zrobić prosty kod i debugować go, aby zobaczyć, co to jest, ale pokazał zmienną zerową na zmiennej a.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ActivityMainBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_main); 
    android.databinding.DataBindingComponent a = DataBindingUtil.getDefaultComponent(); 
    setContentView(binding.getRoot()); 
} 
+0

można śledzić ten oficjalny przewodnik https://developer.android.com/topic/libraries/data-binding/index.html lub w tym samouczku http://www.survivingwithandroid.com/2015/08/android-data -binding-tutorial-2.html –

+1

Wiem, jak używać androida. Ale widziałem tej klasy "DataBindingComponent" jest używany w kilku metodach w klasie "DataBindingUtil". Chciałbym wiedzieć, co to jest i jak można go wykorzystać. –

Odpowiedz

8

Z documentation wiemy

Interfejs ten jest generowany podczas kompilacji zawierać pobierające dla wszystkich stosowanych BindingAdapters instancji. Gdy BindingAdapter jest metodą instancji, instancja klasy implementującej metodę musi być utworzona w instancji. Ten interfejs zostanie wygenerowany z programem pobierającym dla każdej klasy o nazwie get * gdzie * jest prostą nazwą klasy deklarującej klasę/interfejs BindingAdapter. Kolizje nazw zostaną rozwiązane przez dodanie sufiksu liczbowego do pobierającego.

Instancja tej klasy może również zostać przekazana do statycznego lub instancji BindingAdapters jako pierwszy parametr.

Jeśli używasz Dagger 2, programista powinien rozszerzyć ten interfejs i opisać interfejs rozszerzony jako komponent.

To mówi nam, że ten interfejs jest używany i generowany do wstrzykiwania fabryki dla instancji implementujących niestandardowe metody @BindingAdapter. W ten sposób można skonfigurować powiązania danych dla różnych sytuacji lub układów lub podać bardziej ogólny stan. Jeśli spojrzysz na domyślną klasę DataBindingComponent w Android Studio, znajdziesz ją w build/generated/source/apt/dev.

Metody można użyć z DataBindingComponent

Zważywszy zdefiniować interfejs jak

public interface Foo { 
    @BindingAdapter("foobar") 
    void fooBar(View view, String baz); 
} 

android.databinding.DataBindingComponent interfejs zostanie wygenerowany

public interface DataBindingComponent { 
    di.pkg.Foo getFoo(); 
} 

Ten @BindingAdapter gospodarz dostaje obecnie wykorzystywane w swoich powiązań danych, ale trzeba zaimplementować interfejs siebie i używać go z jednej z metod podanych powyżej jak

DataBindingUtil.setDefaultComponent(new DataBindingComponent(){ 
    @Override 
    public Foo getFoo() { 
     return new Foo() { 
      @Override 
      public void fooBar(View view, String baz) { 
       if (view instanceof TextView) ((TextView) view).setText(baz); 
      } 
     }; 
    } 
}); 

W twoim przykładzie otrzymasz wartość null z DataBindingUtil.getDefaultComponent(), ponieważ nigdy nie ustawiłeś domyślnego komponentu samodzielnie.

+0

Twój trzeci spinet kodowy pokazał błąd podczas kompilacji, ponieważ klasa "Foo" nie jest typem "android.databinding.DataBindingComponent". Jeśli rozumiem to poprawnie, to DataBindingComponent może być używany jako rozwój biblioteki powiązanej z danymi, ponieważ interfejs może być zaimplementowany, a także komponent może być ustawiony ręcznie (co oznacza, że ​​można go rozwinąć w OOP). –

+1

Masz rację. Zapomniałem zaimplementować sam komponent. Nie jestem w 100% pewien, w jaki sposób '@ BindingAdapter' działa z bibliotekami. Komponent 'DataBindingComponent' może być użyty z iniekcją zależności zamiast podejścia statycznego. Ułatwienie zmiany implementacji. – tynn

+0

Dzięki za wyjaśnienie. Próbowałbym utworzyć próbkę, aby wiązanie było bardziej elastyczne, ponieważ przewodnik poprowadził go do napisania statycznych metod wiązania zamiast tworzenia go jako obiektu lub rozszerzania. –

12

Po przeczytaniu odpowiedzi z @tynn, klasa DataBindingComponent może również być zakresem "obiektu" powiązania danych. Zamiast ustawiania wszystkich metod w sposób statyczny, następujący przykład może być użyty do rozszerzenia i niestandardowego. Na przykład, ustawiamy 3 metody bindowania dla ImageView, TextView i typu View. Można skonfigurować interfejs pierwszy (jak Retrofit interfejs API dla 2 setup)

1. Instalacja 3 interfejs pierwszy

ImageViewBindingInterface.java

public interface ImageViewBindingInterface { 
    @BindingAdapter({"bind:imageUrl", "bind:error"}) 
    public void loadImage(ImageView view, String url, Drawable error); 
} 

TextViewBindingInterface.java

public interface TextViewBindingInterface { 
    @BindingAdapter({"bind:font"}) 
     void setFont(TextView textView, String fontName); 
} 

ViewBindingInterface.java

public interface ViewBindingInterface { 
    @BindingAdapter("android:paddingLeft") 
    public void setPaddingLeft(View view, int padding); 
    @BindingAdapter("android:onViewAttachedToWindow") 
    public void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached); 
} 

2. DataBindingComponent.java powinny być aktualizowane automatycznie @tynn jak wspomniano poniżej.

Jeśli przyjrzeć się domyślnej klasy DataBindingComponent w Android Studio go znaleźć się w budowie/generowany/źródło/apt/dev.

public interface DataBindingComponent { 
    example.com.testerapplication.binding.ViewBindingInterface getViewBindingInterface(); 
    example.com.testerapplication.binding.TextViewBindingInterface getTextViewBindingInterface(); 
    example.com.testerapplication.binding.ImageViewBindingInterface getImageViewBindingInterface(); 
} 

3. Zbuduj swoją własną metodę implementacji do wiązania.

BaseImageViewBinding.java

public class BaseImageViewBinding implements ImageViewBindingInterface{ 
    @Override 
    public void loadImage(ImageView view, String url, Drawable error) { 
      Picasso.with(view.getContext()).load(url).error(error).into(view); 
    } 
} 

BaseTextViewBinding.java

public class BaseTextViewBinding implements TextViewBindingInterface { 
    @Override 
    public void setFont(TextView textView, String fontName) { 
     textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName)); 
    } 
} 

BaseViewBinding.java

public class BaseViewBinding implements ViewBindingInterface { 
    @Override 
    public void setPaddingLeft(View view, int padding) { 
     view.setPadding(padding, 
       view.getPaddingTop(), 
       view.getPaddingRight(), 
       view.getPaddingBottom()); 
    } 
    @Override 
    public void setListener(View view, ViewBindingAdapter.OnViewAttachedToWindow attached) { 

    } 
} 

4. Ustaw OwnDatabindingComponent

public class MyOwnDefaultDataBindingComponent implements android.databinding.DataBindingComponent { 
    @Override 
    public ViewBindingInterface getViewBindingInterface() { 
     return new BaseViewBinding(); 
    } 
    @Override 
    public TextViewBindingInterface getTextViewBindingInterface() { 
     return new BaseTextViewBinding(); 
    } 
    @Override 
    public ImageViewBindingInterface getImageViewBindingInterface() { 
     return new BaseImageViewBinding(); 
    } 
} 

5. Konfiguracja domyślna DataBindingComponent we Wniosku

public class MyApplication extends Application { 
    public void onCreate() { 
     super.onCreate(); 
     DataBindingUtil.setDefaultComponent(new MyOwnDefaultDataBindingComponent()); 
    } 
} 

Korzystanie z tej metody powinno być w porządku, aby niestandardowe powiązanie danych w sposób niestandardowy i można rozszerzyć.