web-dev-qa-db-ja.com

アクションバーのタブインジケーターをプログラムで変更することは可能ですか?

アクションバーの選択したタブインジケーターをプログラムで変更するにはどうすればよいですか? tab styling 、およびTab.setCustomView()メソッドについて読んだことがありますが、これらはどれも役に立ちません:

  • タブスタイルを使用すると、インジケーターの色を変更できますが、すべてのタブに残ります(各タブにインジケーターが必要です)。

  • タブカスタムビューでは、タブタイトルにTextView、インジケーターの色を管理するためにViewのレイアウトを使用しました。 Javaで、Viewの背景を動的に変更しますが、それに関する問題は、Viewの背景がタブの境界と一致しないことです。

<TextView
    Android:id="@+id/custom_tab_text"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" 
    Android:layout_centerInParent="true"
    Android:layout_centerHorizontal="true"
    Android:gravity="center|center_horizontal"
    Android:textStyle="bold"/>

<View 
    Android:id="@+id/custom_tab_view"
    Android:layout_width="match_parent"
    Android:layout_height="10dp" 
    Android:layout_alignParentBottom="true"/>

誰かが私がどこが間違っているのか教えてもらえますか?それを行う別の方法はありますか?ありがとう

12
S.Thiongane

@Padmaの回答を使用してタブインジケーターの背景を生成することで、必要なものを実装することに成功しました。緑、黄、青、オレンジ、赤の5つのセレクターが必要でした。だから私は5xml drawablestabs_selector_red.xml, tabs_selector_blue.xml, etc...)を作成しました:

tabs_selector_green.xml:

    <!-- Non focused states -->
<item Android:drawable="@Android:color/transparent" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs_green" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="true"/>

<!-- Focused states -->
<item Android:drawable="@Android:color/transparent" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs_green" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="true"/>

<!-- Pressed -->
<!-- Non focused states -->
<item Android:drawable="@Android:color/transparent" Android:state_focused="false" Android:state_pressed="true" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs_green" Android:state_focused="false" Android:state_pressed="true" Android:state_selected="true"/>

<!-- Focused states -->
<item Android:drawable="@Android:color/transparent" Android:state_focused="true" Android:state_pressed="true" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs_green" Android:state_focused="true" Android:state_pressed="true" Android:state_selected="true"/>

また、xmlの背景ごとにlayer-listを作成しました:layer_bg_selected_tabs_green.xml

<item>
    <shape Android:shape="rectangle" >
        <solid Android:color="@color/tab_green" />

        <padding Android:bottom="5dp" />
    </shape>
</item>
<item>
    <shape Android:shape="rectangle" >
        <solid Android:color="#FFFFFF" />
    </shape>
</item>

そして最後に、Javaで、選択したタブのcustom viewindexを使用して、バックグラウンド購入を動的に切り替えます。

private static final int[] TABS_BACKGROUND = {
        R.drawable.tabs_selector_orange, R.drawable.tabs_selector_green,
        R.drawable.tabs_selector_red, R.drawable.tabs_selector_blue,
        R.drawable.tabs_selector_yellow };
/*
BLA BLA BLA
*/
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
    RelativeLayout tabLayout = (RelativeLayout) tab.getCustomView();
    tabLayout.setBackgroundResource(TABS_BACKGROUND[tab.getPosition()]);
    tab.setCustomView(tabLayout);
/* ... */
}

それでは、いくつかのスクリーンショットを追加しましょう:

greenbluered

17
S.Thiongane

//タブバーは

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    style="@style/Wrap"
    Android:background="@drawable/tabs_selector"
    Android:gravity="center_horizontal|bottom"
    Android:minHeight="@dimen/size_fourty"
     >
    <TextView
    Android:id="@+id/custom_tab_text"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" 
    Android:layout_centerInParent="true"
    Android:layout_centerHorizontal="true"
    Android:gravity="center|center_horizontal"
    Android:textStyle="bold"/>

</RelativeLayout>

//tabs_selector.xmlは次のようになります

<!-- Non focused states -->
<item Android:drawable="@drawable/layer_bg_unselected_tabs" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="true"/>

<!-- Focused states -->
<item Android:drawable="@drawable/layer_bg_unselected_tabs" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="true"/>

<!-- Pressed -->
<!-- Non focused states -->
<item Android:drawable="@drawable/layer_bg_unselected_tabs" Android:state_focused="false" Android:state_pressed="true" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs" Android:state_focused="false" Android:state_pressed="true" Android:state_selected="true"/>

<!-- Focused states -->
<item Android:drawable="@drawable/layer_bg_unselected_tabs" Android:state_focused="true" Android:state_pressed="true" Android:state_selected="false"/>
<item Android:drawable="@drawable/layer_bg_selected_tabs" Android:state_focused="true" Android:state_pressed="true" Android:state_selected="true"/>

// layer_bg_unselected_tabsは次のようになります

<item>
    <shape Android:shape="rectangle" >
        <solid Android:color="@color/red" />

        <padding Android:bottom="2dp" />
    </shape>
</item>
<item>
    <shape Android:shape="rectangle" >
        <solid Android:color="@color/gray" />
    </shape>
</item>

// layer_bg_selected_tabsは次のようになります

<item>
    <shape Android:shape="rectangle" >
        <solid Android:color="@color/red" />

        <padding Android:bottom="8dp" />
    </shape>
</item>
<item>
    <shape Android:shape="rectangle" >
        <solid Android:color="@color/gray" />
    </shape>
</item>
5
Padma Kumar