2016-06-26 11 views
13

Il TabLayout documentation dà un esempio di nidificazione TabItem direttamente all'interno TabLayout in questo modo:Come viene utilizzato TabItem quando inserito nell'XML del layout?

<android.support.design.widget.TabLayout 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent"> 

    <android.support.design.widget.TabItem 
     android:text="@string/tab_text"/> 

    <android.support.design.widget.TabItem 
     android:icon="@drawable/ic_android"/> 

</android.support.design.widget.TabLayout> 

ma dà nessun esempio di come questo potrebbe essere utilizzato nella pratica, e la documentazione per TabItem dice:

Questa vista non è effettivamente aggiunta a TabLayout, è solo un manichino che consente di impostare il testo, l'icona e il layout personalizzato di una scheda.

Quindi cosa è TabItem? Dopo un'ampia ricerca su Google, non riesco a trovare un singolo esempio di chiunque definisca TabItem in XML. C'è un modo per impostare un'attività a schede usando TabItem nel file di risorse come mostrato sopra?

risposta

18

Questa sembra essere un'aggiunta relativamente recente alla libreria di progettazione, apparentemente aggiunta nella versione 23.2.0, sebbene non sia menzionata in the revision history. La sua funzionalità è piuttosto semplice e gli unici attributi che sembra utilizzare sono i tre dati nel suo docs: text, icon e layout.

Da testing, sembra che sia fondamentalmente un collegamento XML per creare un nuovo Tab e impostarne il testo, l'icona e l'View personalizzato, come si farebbe di solito nel codice. Quando viene visualizzato il messaggio "Questa vista non viene effettivamente aggiunta a TabLayout", credo che sia intesa a suggerire che non è un View nel senso normale, in quanto non è possibile impostare alcun tipo di attributo di layout standard su di esso, ad esempio layout_width o background . Serve semplicemente a causare il TabLayout per creare un nuovo Tab per ogni TabItem e chiamare setText(), setIcon() e setCustomView() di conseguenza.

Ad esempio, per aggiungere un Tab nel codice, ci sarebbe di solito fare qualcosa di simile:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 

// Add Tab 
TabLayout.Tab tab = tabLayout.newTab(); 

tab.setCustomView(R.layout.tab); 
tab.setText("Tab 1"); 
tab.setIcon(R.drawable.ic_launcher); 

tabLayout.addTab(tab); 

Mentre ora siamo in grado di sostituire tutto dopo il commento di cui sopra con l'aggiunta di un TabItem nel layout.

<android.support.design.widget.TabLayout 
    android:id="@+id/tab_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.design.widget.TabItem 
     android:layout="@layout/tab" 
     android:text="Tab 1" 
     android:icon="@drawable/ic_launcher" /> 

</android.support.design.widget.TabLayout> 

Si noti che si applicano ancora gli stessi requisiti per il layout personalizzato View. Cioè, il TextView per il testo deve avere l'ID di risorsa del sistema @android:id/text1, e l'ImageView per l'icona deve avere l'ID @android:id/icon. A titolo di esempio, il R.layout.tab dall'alto:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical"> 

    <ImageView android:id="@android:id/icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView android:id="@android:id/text1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 
+0

In TabItem tuo esempio, si definisce l'attributo di layout nel testo cornice aggiunta e l'icona. Stai dicendo che Android sa di applicare l'attributo di testo ("Tab 1") nel TextView del tuo layout personalizzato ("@android: id/text1")? –

+1

Sì, esattamente. Ecco perché 'TextView' e' ImageView' devono avere quegli ID specifici. È così che funziona anche nel codice, se hai mai impostato 'View's personalizzati su' Tab's. –

+0

Grazie! Se questo dovesse essere impostato con un ViewPager, dovresti semplicemente passare l'oggetto TabLayout nell'adattatore in modo che possa informare ViewPager delle schede esistenti? Un modo per integrarli senza che il ViewPager compilare automaticamente il TabLayout come di solito è fatto? –

Problemi correlati