2016-06-28 8 views
7

Ich verwende in meiner neuen App die Datenbindungsbibliothek von Android. Derzeit versuche ich, eine Referenz einer anderen Ansicht an eine Methode zu übergeben.Android Data Binding - Referenz

Ich habe eine ImageButton mit einer onClickListener. In diesem onClick-Listener möchte ich eine Referenz der Stammansicht an die Methode übergeben.

<RelativLayout 
    android:id="@+id/root_element" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentStart="true" 
     android:contentDescription="@string/close_dialog" 
     android:src="@drawable/ic_close_212121_24dp" 
     android:background="@android:color/transparent" 
     android:onClick="@{() -> Helper.doSth(root_element)}"/> 

</RelativLayout> 

Dieser oben angegebene Quellcode ist nur ein Beispiel und nicht der vollständige. Es gibt mehr Kinder und auch die Bildschaltfläche ist kein direktes Kind des Wurzelelements. Aber ich denke, die Bedeutung ist klar.

Ich habe bereits versucht, eine Referenz zu übergeben, indem ich die ID der Stammansicht angegeben habe (siehe oben). Aber das funktioniert nicht. Wenn ich versuche, dies zu kompilieren, bekomme ich den Fehler, dass der Typ root_element nicht angegeben ist.

Ich habe auch versucht, die generierte Bindungsklasse zu importieren und auf das Root-Element durch das öffentliche Feld zuzugreifen. Auch diese Methode funktioniert nicht, da die Bindungsklasse zuerst erzeugt werden muss.

Gibt es eine Möglichkeit, eine Referenz einer Ansicht an eine Methode zu übergeben? Ich weiß, dass ich die ID der Root-Ansicht mit übergeben konnte, aber ich will das nicht, da ich einen Weg finden muss, einen Verweis auf diese Ansicht nur mit der angegebenen ID zu erhalten.

Antwort

4

Der Unterschied zwischen dem, was Sie haben und was Sie tun sollten, ist, übergeben Sie nicht die ID root_element. Stattdessen sollten Sie die Ansicht als eine andere Variable in die Layoutdatei übertragen.

In meinem Fall hatte ich einen Schalter in meinem Layout, den ich als Parameter an eine Methode in meinem Lambda weitergeben wollte. Mein Code ist wie folgt:

MyLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.my_layout, parent, true); 
binding.setDataUpdater(mDataUpdater); 
binding.setTheSwitch(binding.switchFavorite); 

Dann ist mein Layout wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <variable name="dataUpdater" type="..."/> 
     <variable name="theSwitch" type="android.widget.Switch"/> 
     <import type="android.view.View"/> 
    </data> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:onClick="@{()->dataUpdater.doSomething(theSwitch)}"> 
     <Switch 
      style="@style/Switch" 
      android:id="@+id/switch_favorite" 
      ... /> 
.../> 

So wie Sie mit diesem sehen können, in meinem Code, erhalte ich den Verweis auf meine Schalter und geben es in als Variable in der Bindung. Dann habe ich dann in meinem Layout Zugriff darauf, um es in meinem Lambda zu übergeben.

34

Sie können root_element, aber Android Data Binding camel-cases die Namen verwenden. So wird root_element zu rootElement. Ihr Handler sollte sein:

android:onClick="@{() -> Helper.doSth(rootElement)}" 
+2

Ich denke, das sollte die Antwort sein. Viel einfacher und mit Google-Dokumenten geklebt. Für Leute, die mehr Informationen wünschen, können sie sich unten auf Antwort und Google IO 2016 beziehen. http://stackoverflow.com/questions/37727600/cannot-refer-to-other-view-id-in-android-data-binding https://www.youtube.com/watch?v=DAmMN7m3wLU&feature=youtu.be&t=13m59s – OnJohn

+0

Diese Antwort ist korrekt. Wann immer Sie die Datenbindung verwenden, um die Ansichtselemente zu übergeben. Es ist standardmäßig camel-cased. –