Android选项卡背景在未选中时不会更改

时间:2017-01-25 17:49:57

标签: android colors background tabs

我需要在选中后更改选项卡的背景,将未选中的选项卡背景颜色设置回原来的颜色。 出于某种原因,只有在IE之后点击另一个标签时背景才会改变: 我按下第一个标签 - 正确的颜色。 按第二个选项卡 - 第一个选项卡保持突出显示的颜色,第二个选项卡也突出显示。 按第三个 - 第一个恢复正常,第二个仍然突出显示,第三个也突出显示。

这是我的TabLayout和我的一个标签(它们都是相同的设计)

<android.support.design.widget.TabLayout
    android:id="@+id/tab_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#dbdbdb"
    app:tabPaddingBottom="-1dp"
    app:tabPaddingEnd="-1dp"
    app:tabPaddingStart="-1dp"
    app:tabPaddingTop="-1dp"
    app:tabBackground="@drawable/tabs_background_colors"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true" >
    android:background="@android:color/darker_gray" >
    <android.support.design.widget.TabItem
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:icon="@drawable/reservation_w"
        android:id="@+id/tab_reservation"
        android:layout="@layout/tab_item_with_icon"
        android:layout_weight="1" />

tab_item_with_icon

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:background="#00000000">

<ImageView android:id="@android:id/icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:scaleType="fitCenter"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" />

和我的标签监听器

((TabLayout)findViewById(R.id.tab_layout)).addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
            int icon = 0;
            switch (tab.getPosition())
            {
                case 0:
                    icon = R.drawable.reservation_w;
                    break;
                case 1:
                    icon = R.drawable.offers_w;
                    break;
                case 2:
                    icon = R.drawable.folio_w;
                    break;
                case 3:
                    icon = R.drawable.location_w;
                    break;
                case 4:
                    icon = R.drawable.contact_w;
                    break;
            }
            tab.setIcon(icon);
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            int icon = 0;
            switch (tab.getPosition())
            {
                case 0:
                    icon = R.drawable.reservation_g;
                    break;
                case 1:
                    icon = R.drawable.offers_g;
                    break;
                case 2:
                    icon = R.drawable.folio_g;
                    break;
                case 3:
                    icon = R.drawable.location_g;
                    break;
                case 4:
                    icon = R.drawable.contact_g;
                    break;
            }
            tab.setIcon(icon);

此外,这是我的状态xml选项卡

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/tab_background_selected" android:state_selected="true"/>
<item android:drawable="@color/tab_background_unselected" android:state_selected="false"/>

并且here它看起来如何,以防我的演示

提前致谢:)

2 个答案:

答案 0 :(得分:1)

显然它看起来像是一个bug ......但是在onTabUnselect中设置图标会使背景不会改变......不确定为什么,如果有人能够解释它会很高兴。

无论如何,如果你陷入这种混乱,解决方案是不要改变onTabUnselect中的图标,而只是改变onTabSelect事件。 我所做的是将未选中的选项卡的位置从onTabUnselect

保存到全局int中
@Override
        public void onTabUnselected(TabLayout.Tab tab) {
            unselectedTabPosition = tab.getPosition();
        }

然后更改onTabSelect上的图标 -

@Override
        public void onTabSelected(TabLayout.Tab tab) {

            changeToGrayIcon(unselectedTabPosition);

希望这会节省我为此浪费的时间。

答案 1 :(得分:0)

您的第一个xml包含错误。检查android:background属性。在UI线程上运行方法tab.setIcon(icon)。

YourActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        tab.setIcon(icon);
    }
});