2016-06-28 37 views
7

Uso nella mia nuova app la libreria di associazione dati di Android. Attualmente provo a passare un riferimento di un'altra vista a un metodo.Associazione dati Android - Riferimento per visualizzare

Ho un ImageButton con un onClickListener. In questo ascoltatore onClick voglio passare un riferimento della vista root al metodo.

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

Questo codice sorgente sopra riportato è solo un esempio e non il completo. Ci sono più bambini e anche il pulsante immagine non è figlio diretto dell'elemento radice. Ma penso che il significato sia chiaro.

Ho già provato a passare un riferimento specificando l'id della vista radice (vedere sopra). Ma questo non funziona. Se provo a compilare questo, ottengo l'errore, che il tipo di root_element non è specificato.

Ho anche provato a importare la classe di associazione generata e accedere all'elemento radice dal campo pubblico in esso. Anche questo metodo non funziona, poiché la classe di associazione deve essere generata per prima.

Quindi esiste un modo per passare un riferimento di una vista a un metodo? So che potrei passare l'id della vista radice con @id/root_element, ma non lo voglio, dal momento che devo trovare un modo per ottenere un riferimento a questa vista solo con l'ID specificato.

risposta

4

La differenza tra ciò che si ha e ciò che si deve fare è non passare l'id root_element. Piuttosto, passa attraverso la vista come un'altra variabile nel file di layout.

Nel mio caso, ho avuto un passaggio nel mio layout, che volevo passare come parametro a un metodo nel mio lambda. Il mio codice è simile a questo:

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

Poi il mio layout è simile a questo:

<?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" 
      ... /> 
.../> 

Quindi, come si può vedere con questo, nel mio codice, ottengo il riferimento al mio interruttore e passarlo in come variabile nel legame. Poi nel mio layout ho quindi accesso ad esso, per passare attraverso il mio lambda.

34

È possibile utilizzare root_element, ma Android Data Binding casi cammello i nomi. Quindi, root_element diventa rootElement. Il gestore deve essere:

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

Penso che questa dovrebbe essere la risposta. Molto più semplice e incollato con i documenti di Google. Per le persone che desiderano maggiori informazioni, possono fare riferimento alla risposta di seguito e a Google IO 2016. 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

Questa risposta è corretta. ogni volta che si utilizza l'associazione dati per passare gli elementi della vista. Di solito è camel-cased. –