2015-06-16 11 views
8

Czy każdy, kto korzysta z biblioteki biblioteki danych Androida (com.android.databinding: dataBinder) może komentować tę bibliotekę beta? W witrynie dla programistów dla Androida jest napisane: "Może zawierać błędy i może nie działać w twoim przypadku użycia, więc używaj go na własne ryzyko.", A więc wszelkie problemy lub znaczące błędy lub błędy na jego temat?Każdy znaczący błąd lub problemy z biblioteką Android Databinding Library?

+0

magirtopcu, czy możesz wyjaśnić, co sprawia, że ​​błąd jest dla ciebie znaczący? –

Odpowiedz

5

Przez ostatnie kilka tygodni bawiłam się biblioteką danych i jest zaskakująco odporna, ponieważ jest to pierwsza wersja.

Jedyny błąd, jaki znalazłem do tej pory, ma obejście. Wyjaśnię to poniżej.

Przy zastosowaniu <include> tag w pliku układu wiązania z danymi (a plik układ, który teraz używa znacznika <layout> jako root), wygenerowany kod tworzy wiązania dla rodzica <include> zawieszki ViewGroup.

Podczas nadmuchiwania widoku przy użyciu DataBindingUtil, aplikacja ulegnie awarii wraz z kiedy próbuje rozwiązać ViewGroup. Wygląda na to, że występuje inne zachowanie między generatorem kodu a logiką wiążącą środowisko wykonawcze.

problem Przykład

Oto przykład układu problemu wspomnianego powyżej.

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
    </data> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <!-- This include causes no issues --> 
     <include 
      layout="@layout/view_content"/> 

     <ScrollView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

      <!-- This include however causes the data binding to crash on the ScrollView --> 
      <include 
       layout="@layout/view_content"/> 

     </ScrollView> 

    </RelativeLayout> 
</layout> 

A oto załączony układ.

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
    </data> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Test"/> 
</layout> 

Podczas próby użycia DataBindingUtil.setContentView pojawia się następujący błąd.

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ScrollView.setTag(java.lang.Object)' on a null object reference 

Solution (Obejście)

Tymczasowe obejście znalazłem jest związać obojętne wartość rodzica <include> zawieszki ViewGroup. Dzięki temu baza danych może znaleźć grupę ViewGroup w czasie wykonywania, unikając awarii.

Oto przykład poprawki w działaniu:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bind="http://schemas.android.com/apk/res-auto"> 

    <data> 
     <variable 
      name="viewModel" 
      type="com.example.ViewModel"/> 
    </data> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <!-- This include causes no issues --> 
     <include 
      layout="@layout/view_content"/> 

     <ScrollView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      bind:visibility="@{viewModel.dummyVisibility}"> 

      <!-- This include will not cause a problem now that the ScrollView has a value being bound --> 
      <include 
       layout="@layout/view_content"/> 

     </ScrollView> 

    </RelativeLayout> 
</layout> 

I tu jest bardzo podstawowy model widok:

package com.example; 

import android.databinding.BaseObservable; 
import android.databinding.Bindable; 
import android.view.View; 

public class ViewModel extends BaseObservable { 
    @Bindable 
    public int getDummyVisibility() { 
     // TODO: This is a work around. Currently data binding crashes on certain views if they don't have binding. 
     return View.VISIBLE; 
    } 
} 

Mam nadzieję, że to jest ustalona w przyszłości i to rozwiązanie nie będzie wymagany!

Edit

znalazłem inną kwestię dotyczącą zwyczaj wiązania adapterów, które mam podniesione w https://code.google.com/p/android-developer-preview/issues/detail?id=2421

+0

czy zgłosiłeś to na b.android.com? Naprawiliśmy podobny błąd podczas pompowania segregatora danych za pomocą 'attachToRoot = true'. Nie jestem pewien, czy jest to spowodowane przez to, ale chciałbym się upewnić, że zostało to naprawione. (stworzy wewnętrzny raport o błędzie, ale chciałby utworzyć łącze do publicznego, jeśli istnieje). – yigit

+0

Po zgłoszeniu tego postu podniosłem zgłoszenie błędu. Oto [link] (https://code.google.com/p/android-developer-preview/issues/detail?id=2418). Jeśli jest to podobny problem, może zamiast dodawać nowy komentarz, możesz dodać komentarz? –

+0

Dzięki, sprawdzę, czy jest naprawiony – yigit

3

Znalazłem błąd w odniesieniu do ObservableField złożonym here.

Zgodnie z databinding guide klasa modelu może zawierać atrybuty ObservableField, aby zachować jej definicje atrybutów krótkie.Przykład z przewodnikiem:

private static class User extends BaseObservable { 
    public final ObservableField<String> firstName = 
     new ObservableField<>(); 
    public final ObservableField<String> lastName = 
     new ObservableField<>(); 
    public final ObservableInt age = new ObservableInt(); 
} 

Używając tej klasy nazwa atrybutów w klasie BR nie są generowane i zajęcia wykonawcze nie może zostać skompilowany, ponieważ odnoszą się one do nich. Wyjątek: Atrybuty te są również zdefiniowane jako zmienne w XML układu, który nie jest w przypadku przykładowego układu prowadnicy:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="user" type="com.example.User"/> 
    </data> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{user.firstName}"/> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{user.lastName}"/> 
    </LinearLayout> 
</layout> 

BR.user jest określona; BR.firstName, BR.lastName i BR.age nie są.

Zmiana klasy User jak to rozwiązuje problem:

private static class User extends BaseObservable { 
    @Bindable 
    public final ObservableField<String> firstName = 
     new ObservableField<>(); 
    @Bindable 
    public final ObservableField<String> lastName = 
     new ObservableField<>(); 
    @Bindable 
    public final ObservableInt age = new ObservableInt(); 
} 

Moim zdaniem przy użyciu obserwowalnych * rodzajów ich nazwiska powinny zostać dodane do BR.java domyślnie @Bindable powinny być nieaktualne.

Przynajmniej ten przewodnik powinien zostać naprawiony poprzez dodanie adnotacji @Bindable do kodu przykładowego ObservableField.

Zajęło mi dwa dni na przeanalizowanie i naprawienie tego problemu.

+0

Błąd został naprawiony w najnowszej wersji biblioteki Android Databinding Library. –

1

Obecnie nie obsługuje @style. Na przykład:

style="@{viewModel.getStyle() ?? @style/default_style}" 

Powyższe spowoduje ustawienie domyślnego stylu znalezionego w zasobach stylów, jeśli getStyle() zwróci wartość null. Niestety nie jest to możliwe, ale stanowiłoby bardzo potężny dodatek do wiązania danych imo.

1

Po zaimplementowaniu wzorca MVVM za pomocą biblioteki powiązań danych w systemie Android, znalazłem kilka błędów. Niektóre z nich zostały już tutaj wspomniane. Mimo to mogę dodać kolejny błąd związany ze zdarzeniami. Zdarzenia nie mogą zawierać parametrów. Oznacza to, że biblioteka wiążąca dane nie ma ważnej możliwości przesyłania dodatkowych informacji podczas wysyłania zdarzeń. Mam jednak nadzieję, że w następnym wydaniu zostanie to naprawione. Do tego czasu spójrz na rozwiązanie tego problemu tutaj: https://code.google.com/p/android/issues/detail?id=185097

Powiązane problemy