2016-04-11 4 views
18

Ich verwende Datenbindung, um die Layouts in meiner Android-App zu binden.Die Inflate-Methode für meine Bindung wurde nicht gefunden (mit Android, Datenbindung.)

Ich habe mein Layout (my_custom.xml) eingerichtet und die Bindungsklasse generiert (MyCustomBinding), aber Android Studio scheint die .inflate (...) Methode der Binding-Klasse nicht sofort zu finden, Markierung es ist ein Fehler (roter Text!).

Der Code scheint jedoch korrekt zu sein, da es kompiliert und genau in ein APK erstellt.

Wie bekomme ich Android Studio zur korrekten Aktualisierung?

Code-Beispiel:

Dies ist meine benutzerdefinierte Ansicht Code:

public class MyCustomView extends FrameLayout { 
    public MyCustomView(Context context) { 
     this(context, null, 0); 
    } 
    public MyCustomView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 
    public MyCustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     MyCustomBinding binding = MyCustomBinding.inflate(inflater, this, true); 
     binding.aButton.setText("Whatever"); 
    } 
} 

Layout ist wie folgt definiert:

<?xml version="1.0" encoding="utf-8"?> 
<layout 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
    </data> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     > 
     <TextView 
      android:id="@+id/a_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Click me!" 
      android:padding="10dp" 
      android:background="#000" 
      android:textColor="#fff" 
      android:layout_gravity="center" 
      /> 
    </FrameLayout> 
</layout> 

Und hier ist das Problem: (rot markiert)

enter image description here

+0

posten Sie bitte Ihren Code. Verwenden Sie Aktivität oder Fragment? –

+0

Post "MyCutomBinding" Klassencode. –

+0

Das scheint mir ein Fehler in Android Studio 2.2 zu sein. Ich verwende Datenbindung ohne dieses Problem seit Monaten, bis ich heute ein Upgrade durchgeführt habe, und jetzt sehe ich es auch. Es gibt einen [Fehlerbericht] (https://code.google.com/p/android/issues/detail?id=222194), wenn Sie ihm folgen möchten. –

Antwort

8

Etwas nicht in Android Studio ist abgeschlossen, weil Sie nicht tatsächlich Daten implementiert verbindlich. Sobald Sie eine Variable zum data -Element Ihres Layouts hinzufügen, wird die inflate-Methode wie erwartet gefunden. Das heißt, Sie profitieren nicht wirklich von der Datenbindung, indem Sie den Wert des Textfelds direkt über die Bindung festlegen. Sie sollten stattdessen ein Ansichtsmodell in der Bindung festlegen und dann die Bindung entsprechend aktualisieren.Zum Beispiel:

eine Ansicht Modell erstellen:

public class MyViewModel { 
    public final ObservableField<String> name; 
    public MyViewModel(String name) { 
     this.name = new ObservableField<>(name); 
    } 
} 

und verwenden Sie es in Ihrem Layout

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="model" type="com.victoriaschocolates.conceirge.MyViewModel" /> 
    </data> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     > 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{model.name}" 
      android:padding="10dp" 
      android:background="#000" 
      android:textColor="#fff" 
      android:layout_gravity="center" 
      /> 
    </FrameLayout> 
</layout> 

(beachten Sie die variable im data Element deklariert, und wie es in der Textview ist referenziert text Attribut)

dann binden Sie die beiden in Ihrer benutzerdefinierten Ansicht:

public class MyCustomView extends FrameLayout { 

    public MyCustomView(Context context) { 
     this(context, null, 0); 
    } 

    public MyCustomView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     MyCustomBinding binding = MyCustomBinding.inflate(inflater, this, true); 
     MyViewModel model = new MyViewModel("Whatever"); 
     binding.setModel(model); 
    } 
} 

Natürlich wäre es wahrscheinlich besser, noch die Daten in durch einen Setter in der benutzerdefinierten Ansicht Klasse übergeben haben, oder sogar in der Container-Ansicht übergeben (siehe http://developer.android.com/tools/data-binding/guide.html#includes)

+0

Danke! Ja, ich weiß, dass die beabsichtigte Methode zur Verwendung der Datenbindung darin besteht, Modi ad zu verwenden und dann Werte in xml zu binden. Ich finde es manchmal einfacher, nur die Bindung im Code zu machen, im Gegensatz zu einem Modell-Objekt usw. – treesAreEverywhere

+0

Meine Lösung dafür ist jetzt, eine leere Modellklasse zu definieren: public class EmptyModel {}, und dann definieren Sie das als eine Variable [[]], ohne sie tatsächlich an irgendwelche Ansichten zu binden. – treesAreEverywhere

2

können Sie versuchen, einen benutzerdefinierten Klassennamen auf Ihre Bindung Layout-Einstellung, und es in der benutzerdefinierten Ansicht verweisen, um zu, welches Layout Sie verwenden:

<layout> 
    <data class="MyCustomBinding"> 
    </data> 
</layout> 

Wenn diese verwenden nicht funktionieren DataBindingUtil statt MyCustomBinding, die liefert die Basis Databinding-Klasse und hat eine inflate() Methode:

MyCustomBinding binding = DataBindingUtil.inflate(inflater, this, true); 

Vom docs:

Manchmal kann die Bindung nicht im Voraus bekannt sein. In solchen Fällen kann die Bindung der DataBindingUtil Klasse erstellt werden:

ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater, layoutId, 
parent, attachToParent); 
ViewDataBinding binding = DataBindingUtil.bindTo(viewRoot, layoutId); 
+1

Danke für die Antwort. Ich bin nicht überzeugt, dass dies meine Frage am besten beantwortet. Ich denke, das ist NICHT einer der Fälle, in denen die MyCustomBinding nicht bekannt ist. Ich * * * die Klasse in Android Studio importieren, und es kompiliert. Der komische Teil ist nur, dass diese .inflate() -Methode nicht erkannt wird. – treesAreEverywhere

+0

Es kompiliert? Oh. Meine Schuld - aber haben Sie versucht, die Klasse in der XML-Datei zu setzen? – yennsarah

+1

Ja, es kompiliert. Es ist meistens ein Problem in Android Studio, glaube ich. Ich habe versucht, die Klasse in der XML zu setzen. Obwohl ich dadurch den Klassennamen der Bindung ändern kann, wird das Problem leider nicht behoben. – treesAreEverywhere

0

Sie brauchen nicht, dass Art von Stoffen, DataBinding enthält DataBindingUtils Klasse hier gehen wir.

public MyCustomView(Context context, AttributeSet attrs, int defStyle){ 
    super(context, attrs, defStyle); 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    MyCustomBinding binding = DataBindingUtil.inflate(inflater, this, true); 
    binding.aButton.setText("Whatever"); 
} 
Verwandte Themen