2016-06-26 6 views
13

TabLayout documentationはそうのようなTabLayout内に直接TabItemをネストする例を示します:レイアウトXMLに配置されたときにTabItemがどのように使用されますか?

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

しかし、これは実際に使用することができる方法のない例を与えていない、とのTabItemのドキュメントは言う:

このビューはTabLayoutに実際には追加されず、タブ項目のテキスト、アイコン、カスタムレイアウトの設定を可能にするダミーです。

だからTabItemとは何ですか?大規模なGoogle検索の後、私はXMLでTabItemsを定義する人の一例を見つけることができません。上記のように、TabItemをリソースファイルに使用してタブ付きアクティビティを設定する方法はありますか?

答えて

18

これは、それがthe revision historyに記載されていないですけれども明らかに、バージョン23.2.0で追加され、設計ライブラリに比較的最近追加さであるように思われます。これは、機能はかなり基本的なものだ、とだけそのdocsに3を与えられて使用するように思わ属性:texticon、およびlayout

テストから、新しいTabを作成し、テキスト、アイコン、およびカスタムViewを通常コードで行うように設定することは基本的にXMLのショートカットであるようです。それは「このビューは、実際にTabLayoutに追加されていない」と言うとき、私はあなたがlayout_widthbackgroundのように、それに標準レイアウト属性のいずれかの種類を設定することができないという点で、それは、通常の意味でのViewないことを示唆するためのものだと信じて。 TabLayoutは、TabItemごとに新しいTabを作成し、それに応じてsetText(),setIcon()、およびsetCustomView()を呼び出します。例えば

、コード内Tabを追加するために、我々は通常、このようなものだろう。今、私たちは、レイアウトにTabItemを追加することにより、上記のコメントの後、すべてを置き換えることができに対し

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

を。

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

カスタムViewレイアウトと同じ要件が適用されます。つまり、システムのリソースID @android:id/text1を持っている必要がありますテキストのTextView、およびアイコンのImageViewはID @android:id/iconを持っている必要があります。たとえば、上記のR.layout.tabは、

<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

の例では、レイアウト属性とテキストとアイコンの設定を追加して定義します。あなたはカスタムレイアウトのTextViewにテキスト属性( "タブ1")を適用することをAndroidが知っていると言っていますか( "@android:id/text1")? –

+1

まあまあです。そのため、 'TextView'と' ImageView'はそれらの特定のIDを持つ必要があります。これは、 'Tab'sでカスタム' View'を設定したことがある場合でも、コードでも同様に動作します。 –

+0

ありがとう!これをViewPagerでセットアップする場合は、TabLayoutオブジェクトをアダプタに渡して、既存のタブについてViewPagerに通知できるでしょうか? ViewPagerを使わずにそれらを統合する方法は、通常行われているようにTabLayoutを自動入力しますか? –

関連する問題