在TabLayout(Android设计支持库)中更改选项卡的背景颜色不会占用整个选项卡空间

2023-12-07

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

以下是我的活动和自定义布局文件的代码片段。

活动代码

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

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

enter image description here

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


将选择器定义为可绘制对象,并且还为选定/未选定状态提供可绘制对象。

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

首先,选择器,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>

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

Then, 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,指定要使用的选择器,并指定选项卡指示符样式,因为app:tabIndicatorColorTabLayout 中的属性现在将被忽略:

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

上面示例颜色的结果:

enter image description here

enter image description here

附加说明:

使用 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'
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在TabLayout(Android设计支持库)中更改选项卡的背景颜色不会占用整个选项卡空间 的相关文章

随机推荐

  • jquery中传递变量

    将 var full 传递给函数 b 的最佳方法是什么 我不想使用全局变量 退货是唯一的选择 p p p class aaa p p p
  • 如何使android中的锚标记可点击

    这是我的代码 TextView aboutL1 TextView findViewById R id aboutL2 aboutL1 setText Html fromHtml This app is open source br The
  • 流改造意外结束

    我有一个 Android 应用程序 它向 Flask 中的 REST API 发出 http 请求 我使用 Retrofit2 和 okhttp3 向带有 Raspbian Lite 的 Raspberry Pi 上托管的服务器发出请求 我
  • 从 JAX-RS servlet 动态创建图像

    是否可以创建 PNG 图像并将其作为 JAX RS 资源的一部分直接输出到浏览器 像这样的东西 Path img externalId Stateless Produces image png public class MyImgResou
  • Apache POI、Excel 2007+ XML 和 OSGI

    对于一个项目 我尝试使用 Apache POI 来获取 Excel XML 功能以与 OSGI 配合使用 我尝试过 POI ServiceMix 捆绑包 但缺少 ooxml schemas jar 将 jar 添加到捆绑包并将其包含在清单中
  • 如何使用CSS动画创建如图所示的立方体开口?

    在我的项目中 当打开主页时 它应该运行 CSS 动画 以便立方体的面打开 动画完成后 脸部应该如图所示 我需要有一个结果就像第一次打开一样图片中 这是我的代码 sk folding cube margin 20px auto width 4
  • 如何避免使用 opencv 和 numpy 逐像素循环图像

    我逐个像素地循环浏览该图像 速度非常慢 我有 2 个图像 我正在比较切片和展平 因此每个元素都是一个名为 3 维 rgb 值e1 and e2 虽然它很慢 有没有一些方法使用opencv or numpy这可以加快速度吗 我在这里所做的是对
  • 维基数据内容协商

    我想知道为什么维基数据内容协商结果与文件中的多个实体有关 例如浏览器中的P2044 http www wikidata org entity P2044 nt 还给我关于 Q6452016 实体的三元组 http www wikidata
  • 我什么时候应该使用@android:id/?

    我找到了一些代码示例 android id xyz属性集而不是 id xyz 何时以及为什么需要使用 Android id 而不是用户的 id 加号表示资源是新的 必须创建它并添加到资源中R java file 省略加号会引用已存在的资源
  • EvtArchiveExportedLog 失败并显示 ERROR_DIRECTORY

    我需要在 Windows Server 2008 R2 上将一些事件从 Windows 事件日志导出到 XML 为了实现这一目标 我使用 EvtExportLog 将这些事件导出到文件 然后尝试使用 EvtArchiveExportedLo
  • 在 Swift 中从单个字符串转换为 ASCII 值的最简单方法是什么?

    我只想在 Swift 中获取单个字符字符串的 ASCII 值 这就是我目前正在做的 var singleChar a println singleChar unicodeScalars singleChar unicodeScalars s
  • if 语句的比较在 bash 中与 test 命令没有按预期工作[重复]

    这个问题在这里已经有答案了 我是一名新手 正在努力让我的第一个 如果那么 语句发挥作用 我编造了一个完全胡说八道的情况来用作试验 但它不起作用 我已经阅读了大约一半关于如何格式化 if then 的描述 但我不知道我可能做错了什么 我的脚本
  • 为什么windows需要withSocketsDo?

    在windows中 socket需要初始化 如图Networks 在 Windows 操作系统上 必须先使用 withSocketsDo 初始化网络子系统 然后才能使用任何网络操作 例如 main withSocketsDo do 尽管这仅
  • Sendgrid API - JSON 调用

    我正在尝试从 SendGrid API 接收数据 ajax type GET url https sendgrid com api bounces get json data api user username api key userke
  • 如何将 @Transactional 与 Spring Data 一起使用?

    我刚刚开始从事 Spring data Hibernate MySQL JPA 项目 我切换到 spring data 这样我就不必担心手动创建查询 我注意到使用 Transactional当您使用 spring data 时不需要 因为我
  • StandardOutput.ReadLine() 使用 C# 挂起应用程序

    以下是应用程序代码 有时 p StandardOutput ReadLine 工作正常 但有时会挂断 我尝试了所有方法 但仍然收到此错误 ProcessStartInfo startInfo new ProcessStartInfo c w
  • MySQL:如何多次连接同一个表?

    我有两张桌子ticket and attr Table ticket has ticked id领域和其他几个领域 桌子attr有3个字段 ticket id numeric attr type numeric attr val strin
  • 是否有基于 oauth 的 Twitter 数据源可用于 CakePHP?

    有一个可用于旧的基本身份验证 但它不再起作用 这是对此类事情的一个很好的介绍 如果您想编写自己的或使用 Neils 插件 http tv cakephp org video CakeFoundation 2010 12 24 neil cr
  • Chrome 配置文件禁用“了解您的位置”弹出窗口

    我正在 Google Chrome 中运行我的测试chromedriver exe二进制 在一个特定页面上会出现此弹出窗口 它不会干扰 影响测试 但客户不想看到它 可能的原因可能是 在测试用例失败时 它将捕获屏幕截图以及此弹出窗口 我怎样才
  • 在TabLayout(Android设计支持库)中更改选项卡的背景颜色不会占用整个选项卡空间

    我有一个 TabLayout 设计支持库 它与包含三个选项卡的 ViewPager 绑定 我设计了一个自定义布局并将其设置到 TabLayout 中的每个选项卡 我一直在尝试更改当前所选选项卡的背景颜色 颜色仅包围选项卡中的文本 但不占据整