2016-06-26 37 views
13

TabLayout documentation podaje przykład gniazdowania TabItem bezpośrednio wewnątrz TabLayout tak:W jaki sposób TabItem jest używany po umieszczeniu w układzie XML?

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

Ale to nie daje przykład, jak to może być stosowane w praktyce, a dokumentacja dla TabItem mówi:

Ten widok nie jest w rzeczywistości dodany do TabLayout, jest tylko manekinem, który pozwala na ustawienie tekstu, ikony i układu niestandardowego elementów karty.

Co to jest TabItem? Po rozbudowanym Googlingu nie mogę znaleźć żadnego przykładu definicji TabItems w XML. Czy istnieje sposób konfigurowania działania z kartami za pomocą TabItem w pliku zasobów, jak pokazano powyżej?

Odpowiedz

18

Wygląda na to, że jest stosunkowo nowym dodatkiem do biblioteki projektowej, najwyraźniej dodanym w wersji 23.2.0, ale nie jest wymienione w the revision history. Jego funkcjonalność jest dość podstawowa i jedyne atrybuty, jakich wydaje się używać, to trzy podane w jego jednostkach: , ,.

Z badań wynika, że ​​jest to skrót XML do tworzenia nowego Tab i ustawiania jego tekstu, ikony i niestandardowego View, tak jak zwykle robi się to w kodzie. Kiedy mówi "Ten widok nie jest faktycznie dodany do TabLayout", uważam, że sugeruje on, że nie jest to View w zwykłym znaczeniu, ponieważ nie można ustawić na nim żadnego standardowego atrybutu układu, takiego jak layout_width lub background . To po prostu służy spowodować TabLayout aby utworzyć nowy Tab dla każdego TabItem, i nazywają setText(), setIcon() i setCustomView() odpowiednio.

Na przykład, aby dodać Tab w kodzie, to zwykle robimy coś takiego:

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

Podczas gdy teraz możemy wymienić wszystko po komentarzu powyżej dodając TabItem w układzie.

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

Należy pamiętać, że nadal obowiązują te same wymagania dotyczące niestandardowego układu View. To znaczy, że TextView dla tekstu musi mieć identyfikator zasobu systemowego @android:id/text1, a ImageView dla ikony musi mieć ID @android:id/icon. Na przykład: R.layout.tab od góry:

<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

W TabItem w przykładzie zdefiniowano dodatkowo atrybut układu, a także ustawiono tekst i ikonę. Czy twierdzisz, że Android wie, aby zastosować atrybut tekstowy ("Tab 1") do swojego TextView w niestandardowym layoucie ("@android: id/text1")? –

+1

Tak, dokładnie. Dlatego 'TextView' i' ImageView' muszą mieć te specyficzne identyfikatory. Tak właśnie działa kod, jeśli kiedykolwiek ustawiłeś niestandardowe 'Widok' na' Tab's. –

+0

Dzięki! Jeśli miałbyś to skonfigurować za pomocą ViewPagera, po prostu przekazałbyś obiekt TabLayout do adaptera, aby mógł poinformować ViewPager o istniejących zakładkach? Jakikolwiek sposób na ich integrację bez wyświetlania ViewPagera automatycznie wypełnia TabLayout tak jak zwykle? –