2015-06-16 3 views
8

Kann jemand, der android Datenbindungsbibliothek (com.android.databinding: dataBinder) verwendet, über diese Beta-Bibliothek kommentieren? In Android Entwickler-Website sagt: "Es könnte Fehler enthalten, und es funktioniert möglicherweise nicht für Ihren Anwendungsfall, so verwenden Sie es auf eigene Gefahr.", So dass alle Probleme oder erhebliche Bug oder Bugs darüber?Jeder signifikante Fehler oder Probleme mit Android Databinding Library?

+0

magirtopcu, können Sie klären, was macht ein Bug für Sie wichtig? –

Antwort

5

Ich habe in den letzten Wochen mit der Databinding-Bibliothek gespielt und es ist überraschend robust, wenn man bedenkt, dass es die allererste Version ist.

Der einzige Fehler, den ich bisher gefunden habe, hat einen Workaround. Ich werde es unten erklären.

Wenn ein <include> Tag in Ihrem Databinding Layout-Datei (eine Layout-Datei, die die <layout> Tag als Wurzel verwendet jetzt), erstellt der generierte Code für die <include> Tag der Mutterviewgroup eine Bindung aus.

Beim Aufblasen der Ansicht mit DataBindingUtil stürzt die Anwendung beim Versuch, die ViewGroup aufzulösen, ab. Es scheint ein anderes Verhalten zwischen dem Codegenerator und der Laufzeitbindungslogik zu geben.

Problem Beispiel

Hier ist ein Beispiel-Layout mit dem Problem, das oben erwähnt wird.

<?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> 

Und hier ist das enthaltene Layout.

<?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> 

Wenn der folgende Absturz zu verwenden DataBindingUtil.setContentView versucht.

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

Solution (Umgehung)

Die vorübergehende Lösung gefunden ist ein Dummy-Wert für die <include> tag-Mutterviewgroup zu binden. Dadurch kann der Databinder die ViewGroup zur Laufzeit finden und so den Absturz vermeiden. Hier

ist ein Beispiel für das Update in Aktion:

<?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> 

Und hier ist das sehr einfache Ansicht Modell:

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; 
    } 
} 

Hoffentlich in der Zukunft festgelegt ist und diese Problemumgehung wird nicht erforderlich!

bearbeiten

fand ich eine andere Frage in Bezug auf kundenspezifische Bindung Adapter, die ich bei https://code.google.com/p/android-developer-preview/issues/detail?id=2421

+0

haben Sie dies auf b.android.com gemeldet? Wir haben einen ähnlichen Fehler behoben, als wir eine Datenbinder mit 'attachToRoot = true' aufgebläht haben. Nicht sicher, ob dies von ihm verursacht wird, möchte sicherstellen, dass es behoben ist. (erstellt einen internen Fehlerbericht, würde aber gerne einen Link zu einem öffentlichen Fehlerbericht erstellen). – yigit

+0

Ich habe einen Fehlerbericht dafür erstellt, nachdem ich diesen Post gemacht habe. Hier ist der [Link] (https://code.google.com/p/android-developer-preview/issues/detail?id=2418). Wenn es sich um ein ähnliches Problem handelt, fügen Sie vielleicht einen Kommentar hinzu, anstatt ein neues Problem zu erstellen. –

+0

Danke, ich werde bestätigen, dass es behoben ist – yigit

3

angehoben habe ich einen Fehler in Bezug auf ObservableField gefunden, here abgelegt.

Gemäß der databinding guide kann eine Modellklasse ObservableField-Attribute enthalten, um die Attributdefinitionen kurz zu halten.Beispiel aus der Führung:

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(); 
} 

Durch die Nutzung dieser Klasse der Name in der Klasse BR-Attribute werden nicht erzeugt und die Implementierungsklassen können nicht kompiliert werden, weil sie sich auf sie beziehen. Ausnahme: Diese Attribute werden auch als Variablen in dem Layout-XML definiert ist, was nicht der Fall in dem Beispiel, das Layout der Führung ist:

<?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 definiert ist; BR.firstName, BR.lastName und BR.age sind nicht.

die Benutzerklasse wie diese Änderung löst das 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(); 
} 

Meiner Meinung nach, wenn beobachtbare * Typen ihre Namen verwenden, sollten standardmäßig aktiviert und @Bindable zu BR.java hinzugefügt werden sollte veraltet sein.

Zumindest die Anleitung sollte behoben werden, indem Sie dem ObservableField-Beispielcode die @Bindable-Annotation hinzufügen.

Ich brauchte zwei Tage, um dieses Problem zu analysieren und zu beheben.

+0

Der Fehler wurde in der neuesten Version der Android Databinding Library behoben. –

1

Momentan wird @style nicht unterstützt. Zum Beispiel:

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

Die oben versuchen würde, einen Standardstil in den Stilen gefunden zu setzen Ressource, wenn getStyle() zurückgegeben null. Leider ist das nicht möglich, würde aber eine sehr mächtige Ergänzung zur Datenbindung imo darstellen.

1

Wenn ich das MVVM-Muster mit Data Binding Library auf Android implementiert habe, habe ich mehrere Fehler gefunden. Einige von ihnen wurden bereits hier erwähnt. Obwohl ich einen weiteren Fehler hinzufügen kann, der sich auf die Ereignisse bezieht. Ereignisse können keine Parameter enthalten. Es bedeutet, dass die Datenbindungsbibliothek keine wichtige Fähigkeit besitzt, zusätzliche Informationen beim Senden von Ereignissen zu übertragen. Ich hoffe jedoch, dass es in der nächsten Version behoben wird. Bis das passiert, schauen Sie sich die Lösung dieses Problems hier an: https://code.google.com/p/android/issues/detail?id=185097

Verwandte Themen