2015-10-20 16 views
6

Sto giocando con Android databinding library e sto cercando di usarlo con i layout inclusi.Come ottenere visualizzazioni incluse con Databinding Android?

Il codice che ho è come questo:

activity_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bind="http://schemas.android.com/apk/res-auto"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id = "@+id/linearLayout"> 

    <include 
     layout="@layout/view" /> 
    </LinearLayout> 
</layout> 

view.xml

<View xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id = "@+id/myView"> 
</View> 

MainActivity.java

public MainActivity extends AppCompatActivity{ 

    private ActivityMainBinding mBinding; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 

    LinearLayout layout = mBinding.linearLayout; // this field is visible 
    View myView = mBinding.myView // THIS FIELD IS NOT VISIBLE 
    } 


} 

Come ho scritto nei commenti v iew myView dichiarato in un layout "incluso" non è visibile. Se sostituisco il codice reale con view.xml, mBinding.myView diventa visibile, la causa sembra essere l'inclusione allora.

Gli stati ufficiali di documentazione unico che

"vincolante non supporta i dati comprendono come un figlio diretto di un elemento di unione." ma nel mio caso View è figlio di LinearLayout, non è un bambino diretto ..

Eventuali suggerimenti?

risposta

14

è necessario fornire un ID per l'istruzione include:

<include android:id="@+id/included" 
    layout="@layout/view" /> 

Ora è possibile accedere alla visualizzazione includono:

View myView = mBinding.included; 

Se il layout incluso è un layout vincolante, la comprendono sarà un legame generato. Per esempio, se è view.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@{@android:color/black}" 
     android:id="@+id/myView"/> 
</layout> 

allora il campo di layout sarà una classe ViewBinding:

View myView = mBinding.included.myView; 
+0

Come posso fare lo stesso, ma per i due layout con lo stesso nome, questo per layout per custodia per tablet. Voglio dire, quando ho due layout chiamati 'layout/layout.xml' e' layout-sw600dp/layout.xml', ma il secondo ha un contenitore 'FrameLayout' per i frammenti, quest'ultimo non appare nella classe generata vincolante. In anticipo grazie. – epool

+1

Se si dispone di una vista in un layout, ma non entrambi, si dovrebbe vedere la vista nella classe, ma sarà nullo quando un layout è associato. Assicurati di fornire gli ID alle viste che desideri avere come proprietà. –

Problemi correlati