【问题标题】:Changing the background color of a Tab in TabLayout (Android design support library) doesn't occupy the entire tab space在 TabLayout(Android 设计支持库)中更改 Tab 的背景颜色不会占用整个选项卡空间
【发布时间】:2023-03-03 09:45:01
【问题描述】:

我有一个 TabLayout(设计支持库),它与包含三个选项卡的 ViewPager 相关联。我设计了一个自定义布局并将其设置为 TabLayout 中的每个选项卡。我一直在尝试更改当前选定选项卡的背景颜色。颜色仅环绕选项卡中的文本,但不占据整个选项卡空间。

下面是我的activity的代码sn-ps和自定义布局文件。

活动代码

public class CustomTabLayoutActivity extends AppCompatActivity {

private TabLayout tabLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_custom_tab_layout);
    tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
    setupViewPager(viewPager);
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    setupTabLayout();
    viewPager.setCurrentItem(0);
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            for (int i = 0; i < tabLayout.getTabCount(); i++) {
                if (i == position) {
                    tabLayout.getTabAt(i).getCustomView().setBackgroundColor(Color.parseColor("#198C19"));
                } else {
                    tabLayout.getTabAt(i).getCustomView().setBackgroundColor(Color.parseColor("#f4f4f4"));
                }
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
}


private void setupViewPager(ViewPager viewPager) {
    CustomViewPagerAdapter pagerAdapter = new CustomViewPagerAdapter(getSupportFragmentManager());
    pagerAdapter.addFragments(new OneFragment(), "ONE");
    pagerAdapter.addFragments(new OneFragment(), "TWO");
    pagerAdapter.addFragments(new OneFragment(), "THREE");
    viewPager.setAdapter(pagerAdapter);
}

private void setupTabLayout() {

    TextView customTab1 = (TextView) LayoutInflater.from(CustomTabLayoutActivity.this)
            .inflate(R.layout.custom_tab_layout, null);
    TextView customTab2 = (TextView) LayoutInflater.from(CustomTabLayoutActivity.this)
            .inflate(R.layout.custom_tab_layout, null);
    TextView customTab3 = (TextView) LayoutInflater.from(CustomTabLayoutActivity.this)
            .inflate(R.layout.custom_tab_layout, null);
    customTab1.setText("ONE");
    tabLayout.getTabAt(0).setCustomView(customTab1);
    customTab2.setText("TWO");
    tabLayout.getTabAt(1).setCustomView(customTab2);
    customTab3.setText("THREE");
    tabLayout.getTabAt(2).setCustomView(customTab3);
}
}

每个选项卡的自定义布局文件

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/tab"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_gravity="center"
   android:background="#ffffff"
   android:text="Test"
   android:textColor="@android:color/black"
   android:textSize="20sp" />

这是运行上述代码后的选项卡截图。

正如你们所看到的,颜色只占据选项卡中的文本,而不是整个选项卡空间。如何做到这一点?任何想法/建议都会对我有很大帮助。提前致谢。

【问题讨论】:

    标签: android android-design-library android-tablayout


    【解决方案1】:

    将选择器定义为可绘制对象,并且还具有用于选定/未选定状态的可绘制对象。

    对于这个解决方案,我从this answer 的代码开始,然后添加了更改当前选项卡背景颜色的功能。

    首先是drawable文件夹中的选择器tab_background.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/tab_background_selected" android:state_selected="true" />
        <item android:drawable="@drawable/tab_background_unselected" android:state_selected="false" android:state_focused="false" android:state_pressed="false" />
    </selector>
    

    那么,drawable文件夹中的tab_background_selected.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <solid android:color="#d13fdd1a" />
    </shape>
    

    那么,drawable文件夹中的tab_background_unselected.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <solid android:color="#3F51B5" />
    </shape>
    

    最后,在您的styles.xml 中,指定要使用的选择器,并指定选项卡指示器样式,因为现在将忽略 TabLayout 中的 app:tabIndicatorColor 属性:

    <style name="Base.Widget.Design.TabLayout" parent="android:Widget">
        <item name="tabBackground">@drawable/tab_background</item>
        <item name="tabIndicatorColor">#ff00ff</item>
        <item name="tabIndicatorHeight">2dp</item>
    </style>
    

    上面示例颜色的结果:

    补充说明:

    使用 23.3.0 版本的支持库组件测试:

    dependencies {
        compile 'com.android.support:appcompat-v7:23.3.0'
        compile 'com.android.support:cardview-v7:23.3.0'
        compile 'com.android.support:recyclerview-v7:23.3.0'
        compile 'com.android.support:design:23.3.0'
        compile 'com.android.support:support-v4:23.3.0'
    }
    

    【讨论】:

    • 哇!在过去的 5 个小时里,我一直在努力实现这一目标。你拯救了我的一天。这就像一个魅力。
    • 你能解释一下为什么我们需要在styles.xml中添加几行代码吗?
    • 很高兴它对你有用!对styles.xml的添加只是为了链接选择器和设置背景颜色的drawables。
    • 选项卡模式设置为固定时效果很好,但设置为可滚动时,选项卡之间的间距会丢失。我已经使用“tab:padding”来添加选项卡之间的间距。这是正确的做法吗?
    • 有没有办法让选定的选项卡根据选项卡位置的颜色不同?例如,选择时第一个选项卡为绿色,选择时第二个选项卡为红色?编辑:我认为可以使用 OnTabSelectedListener() 并为 onTabSelected() 中的每个选项卡使用 TabLayout.setBackgroundResource() 来完成。
    【解决方案2】:

    你应该使用:

    app:tabBackground="@drawable/tab_selector"
    android:background="@color/colorNormal"
    

    tab_selector.xml(在可绘制文件夹中):

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true" android:drawable="@color/colorSelected"/>
        <item android:state_selected="false" android:drawable="@color/colorNormal"/>
    </selector>
    

    【讨论】:

    • 谢谢它对我有用
    • @BipinBharti 不客气
    【解决方案3】:

    具有波纹效果的标签: 除了丹尼尔纽金特的回答,在标签上添加涟漪效果会很漂亮。为了实现这一点,您必须将这两个可绘制对象添加到drawable-v21 文件夹:

    tab_background_selected.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="#63D25B"> <!-- ripple color -->
        <item android:drawable="#d13fdd1a" /> <!-- normal color -->
    </ripple>
    

    tab_background_unselected.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="#606FC7"> <!-- ripple color -->
        <item android:drawable="#3F51B5" /> <!-- normal color -->
    </ripple>
    

    【讨论】:

    • 谢谢你,但我已经从 Daniel Nugent 的回答中得到了连锁反应。我正在使用版本 28.0.0-alpha3 的支持库 - 也许这就是原因?
    • @ban-geoengineering 感谢您的评论。在我写这个答案的时候,我还没有看到丹尼尔的答案产生的连锁反应。
    【解决方案4】:

    我知道回答这个问题已经很晚了,但是在没有创建任何新背景或选择器的情况下有一个不同且简单的答案。 选项卡布局在其开始和结束处具有 12dp 的默认填充。设置好了

    app:tabPaddingStart="0dp"
    app:tabPaddingEnd="0dp"
    

    在标签中填充颜色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2023-03-07
      • 2015-01-04
      • 2019-08-06
      相关资源
      最近更新 更多