web-dev-qa-db-ja.com

Androidタブウィジェットの背景を変更するにはどうすればよいですか?

私のクラスはTabActivityを拡張します

TabHost mTabHost =  getTabHost();

TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1");
TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2");

tab1 .setIndicator("title tab1");
tab2 .setIndicator("title tab2");
mTabHost.addTab(tab1);mTabHost.addTab(tab2);

TabHost.setCurrentTab(0 or 1)

選択したタブの背景画像または色を変更するにはどうすればよいですか?

47
d-man

TabHost.OnTabChangedイベントに登録し、mTabHost.getCurrentTabView()を呼び出してビューを取得してから、view.setBackgroundResource()を呼び出すとどうなりますか?

25
RickNotFred

これにより、タブの色が設定されます。

public static void setTabColor(TabHost tabhost) {
    for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) {
        tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected
    }
    tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected
}

onTabChangedListener()内に配置すると、選択したタブの正しい色が維持されます。

93
Blundell

Mbairdが述べたように、より良い解決策は、セレクタでbackgroundを使用することです。したがって、onTabChangedを確認して手動で更新する必要はありません。最小限のコードは次のとおりです。

private void initTabsAppearance(TabWidget tabWidget) {
    // Change background
    for(int i=0; i < tabWidget.getChildCount(); i++)
        tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_bg);
}

tab_bgは、セレクターを使用したxmlのドロアブルです。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">    
    <item Android:state_selected="true" Android:drawable="@drawable/tab_bg_selected" />
    <item Android:drawable="@drawable/tab_bg_normal" />
</selector>

タブを完全にカスタマイズするには、カスタムテーマを使用してタブテキストスタイルを変更するためのコードを追加します。これをstyles.xmlに追加します:

<resources>

    <style name="MyCustomTheme" parent="@Android:style/Theme.Light.NoTitleBar">
        <item name="Android:tabWidgetStyle">@style/CustomTabWidget</item>
    </style>

    <style name="CustomTabWidget" parent="@Android:style/Widget.TabWidget">
        <item name="Android:textAppearance">@style/CustomTabWidgetText</item>
    </style>

    <style name="CustomTabWidgetText" parent="@Android:style/TextAppearance.Widget.TabWidget">
        <item name="Android:textSize">12sp</item>
        <item name="Android:textStyle">bold</item>
    </style>

</resources>

このテーマを使用するには、AndroidManifest.xmlで定義します。

<application Android:theme="@style/MyCustomTheme">

これで、カスタム背景およびカスタムテキストスタイルのタブウィジェットができました。

36
peter.bartos
>     TabHost mTabHost =  getTabHost();
>     
>     TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1");
>     TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2");
>     
>     tab1.setIndicator("title tab1");
>     tab2.setIndicator("title tab2");
>     mTabHost.addTab(tab1) ;mTabHost.addTab(tab2);
>     
>     TabHost.setCurrentTab(0 or 1);


mTabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.drawable.tab1selector); 

mTabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.drawable.tab2selector);    

mTabHost.getTabWidget().getChildAt(2).setBackgroundResource(R.drawable.tab3selector);    

mTabHost.getTabWidget().getChildAt(3).setBackgroundResource(R.drawable.tab4selector);

。setBackgroundResourceを使用し、tabNselectorはXMLです-tabNselector.xml

    <?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <item Android:state_selected="false" Android:drawable="@drawable/tabN"/>
   <item Android:state_selected="true" Android:drawable="@drawable/tabNsel"  />
</selector>
2
Jamal

this は問題を解決しますか?基本的に、セレクタを使用して各タブビューでsetBackgroundDrawableを呼び出しますか?

2
Mark B

XMLのTabWidget要素に「Android:background」パラメーターを設定して、すべてのタブの一般的な背景を提供します。

次に、「。setIndicator」メソッドで別のXMLから拡張されたビューを渡しました。

 View v = LayoutInflater.from(this).inflate(R.layout.tab_widget, null);
    TextView label = (TextView) v.findViewById(R.id.tabLabel);
    label.setText("Whatever");
 tab1 .setContent(v);

これはもっと良い方法だと思います。

0
Saad Farooq