不同的 ActionBar.Tab 使用不同的颜色

2024-02-09

我想让 ActionBar 中的所有选项卡都有不同的颜色指示器,例如选项卡 1 为蓝色,选项卡 2 为红色等。

为了实现这一点,我为所有颜色创建了不同的选择器,并将它们放在可绘制的不同 xml 中。在 style.xml 中我通过以下方式调用它们

<style name="MyTheme" parent="AppBaseTheme">
<item name="android:actionBarTabStyle">@style/ActionBarTabStyleRed</item>
</style>
<style name="ActionBarTabStyleRed">
<item name="android:background">@drawable/tab_indicator_red</item>
</style>

我也为不同的颜色创建了这种样式。现在,当我将可绘制或样式更改为不同的颜色时,它就可以工作了。我可以看到颜色应用于选项卡。但由于所有选项卡都是相同的颜色,所以它没有解决我的目的。我尝试在中设置选项卡样式onTabSelected()但没有办法做到这一点。

最终我尝试为不同的颜色创建不同的主题,并尝试以编程方式设置主题onTabSelected(),但后来我知道必须先设置主题setContentView().
所以我的问题是..我该怎么做?有什么办法可以为不同的选项卡指示器设置不同的颜色吗???

Update:-
可绘制/tab_indicator_red.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Non focused states -->
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" />
    <item android:state_focused="false" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_red" />

    <!-- Focused states -->
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_focused_red" />
    <item android:state_focused="true" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_focused_red" />

    <!-- Pressed -->
    <!--    Non focused states -->
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_red" />
    <item android:state_focused="false" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_red" />

    <!--    Focused states -->
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_red" />
    <item android:state_focused="true" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_red" />
</selector>

我想我已经为你找到了一个起点,但有点复杂。 使用以下代码设置操作栏,您可以设置选项卡以使用自定义外观:

  //...somewhere in oncreate
  ActionBar bar = getActionBar();

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab tab1 = bar.newTab();
    TextView tv1 = createTab("Tab 1", R.drawable.firsttabdrawable);
    tab1.setCustomView(tv1);
    tab1.setTabListener(this);
    ActionBar.Tab tab2 = bar.newTab();
    tab2.setCustomView(createTab("Tab 2", R.drawable.secondTabDrawable));
    tab2.setTabListener(this);
    ActionBar.Tab tab3 = bar.newTab();
    tab3.setCustomView(createTab("Tab 3", R.drawable.thirdTabDrawable));
    tab3.setTabListener(this);
    ActionBar.Tab tab4 = bar.newTab();
    tab4.setCustomView(createTab("Tab 4", R.drawable.fourthTabDrawable));
    tab4.setTabListener(this);  

    bar.addTab(tab1);
    bar.addTab(tab2);
    bar.addTab(tab3);
    bar.addTab(tab4);

createTab方法如下:

  private TextView createTab(String titleText, int tabBackgroundDrawableId)
{
    TextView tv = new TextView(this);
    //set caption and caption appearance
    tv.setTextAppearance(this, R.style.MyDefaultTabTextAppearance);
    tv.setText(titleText);
    //set appearance of tab
    tv.setBackgroundResource(tabBackgroundDrawableId);
    tv.setLayoutParams(new android.view.ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
    //Make sure all tabs have the same height
    tv.setMaxLines(2);
    tv.setMinLines(2);

    return tv;      
}

然而,操作栏似乎将选项卡视图添加到添加填充的父视图中,因此对于每个视图,您都需要将其删除。我在第一个代码块之后的 oncreate 中这样做了,如下所示:

  View view = (View) tv1.getParent();       
    LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams)view.getLayoutParams();
    view.setPadding(0, 0, 0, 0);
    view.setLayoutParams(lp);

您可能会找到一种更优雅/直接的方法来执行此操作,但作为起点,我认为值得发布。

希望这可以帮助。

ADDED:

还值得指出的是,如果您的选项卡有更复杂的布局,您可以在 createTab 方法中扩充布局 xml 文件。例如,使用以下 xml (mytab.xml):

  <?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tabIcon"/>
<TextView style="@style/MyDefaultTabTextAppearance"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/tabIcon"
    android:minLines="2"
    android:maxLines="2"
    android:id="@+id/tabText"/>
  </RelativeLayout>

创建选项卡变为:

  private RelativeLayout createTab(String titleText, int tabBackgroundDrawableId)
{
    RelativeLayout rl = (RelativeLayout)this.getLayoutInflater().inflate(R.layout.mytab, null, false);  
     //set appearance of tab
    rl.setBackgroundResource(tabBackgroundDrawableId);

    TextView tv = (TextView)rl.findViewById(R.id.tabText);
    //set caption       
    tv.setText(titleText);     

    ImageView iv = (ImageView)rl.findViewById(R.id.tabIcon);

    iv.setImageResource(R.drawable.ic_launcher);//or supply unique drawable to method?      
    return rl;      
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不同的 ActionBar.Tab 使用不同的颜色 的相关文章

  • onBeaconServiceConnect 未调用

    和以前一样 我使用 Android Beacon 库 它已经工作了 我可以通过 BLE 低功耗蓝牙找到信标 但是现在 更新到最新版本的库后 现在方法onBeaconServiceConnect 不再跑了 请告诉我我需要做什么才能让它发挥作用
  • Android:使用 OAuth 访问 google 任务时出现问题

    由于 google 任务没有公共 api 我想编写解决方法并像浏览器一样请求数据 然后解析结果以进一步显示 为了访问数据 我使用 google 实现了 OAuth 身份验证来访问此 url https mail google com htt
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • AudioTrack、SoundPool 或 MediaPlayer,我应该使用哪个?

    如果我需要能够 播放多个音频文件 具有不同的持续时间 例如 5 到 30 秒 独立设置右 左声道的音量 应用声音效果 如混响 失真 那么 我应该使用哪个 API 另外 我在 AudioTrack API 上找不到太多文档 有谁知道在哪里可以
  • Android 应用程序中的 Eszett (ß)

    我的 res layout activity 文件中的德语 字符在我的应用程序中自动转换为 ss 即使我将语言和键盘设置为德语 它仍然不会显示 Android 中可以显示 吗 edit
  • 使用 gradlew assembleRelease 从 React Native 创建发布 apk 时出现错误

    我想发布 apk 但我收到错误 文件已存在 mkdir D mobile 它在 d 驱动器中生成名为 mobile 的文件 删除文件后 再次执行 gradlew assembleRelease 创建该文件并抛出错误 任务 app bundl
  • 如何检查用户在EditText中输入自己的电话号码?

    用户将在我的 Android 应用程序的注册页面上的编辑文本中输入手机号码 如何检查用户输入的是他 她的手机号码而不是其他人的 我试过这个 TelephonyManager tMgr TelephonyManager mAppContext
  • 如何检查 Android 中连接的 wifi 网络是否处于活动状态

    如何自动检查android中连接的WiFi网络上的互联网是否处于活动状态 我可以检查 wifi 是否已启用或 wifi 网络是否已连接 但我不确定如何检查互联网是否已连接 这可能吗 private boolean connectionAva
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度

    我知道如何使用 getOrientation 方法获取手机 y 轴和磁北之间的方向角 如此处所述https developer android com guide topics sensors sensors position https
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 菜单在片段的 onCreateOptionsMenu 处多次膨胀调用

    我使用 Fragments 当我切换到嵌套 Fragment 时 它实现了public void onCreateOptionsMenu Menu menu MenuInflater inflater 当我到达该嵌套片段时 我的菜单会多次膨
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 如何在android asynctask中使用inputstream作为参数?

    我正在制作一个 Android 应用程序来跟踪股票详细信息 我将通过 csv 雅虎财经 检索数据 据我所知 在android 4 0中 网络连接无法在主线程上完成 因此 我将使用 asynctask 来建立连接 但是 我在参数方面遇到了一些
  • 模块中的类无法加载

    我正在开发一个 2D Unity android 游戏 其中我最近添加了 Firebase Beta SDK 但添加后FirebaseAnalytics unitypackage我面临的错误是 无法加载模块中的类 当我删除文件夹时Fireb
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 获取其他指针的MotionEvent.getRawX/getRawY

    我可以获取其他指针的MotionEvent getRawX getRawY 值吗 MotionEvent getRawX API 参考 http developer android com reference android view Mo
  • Android应用程序可以像旧的普通java小程序一样嵌入到网页中吗?

    我对 android 平台一无所知 也无法在互联网上找到这个基本问题的答案 更新 好的 我本身无法嵌入 Android 应用程序 但是我可以在 Android Webbrowser 中嵌入 Java 的东西吗 不可以 您无法将 Androi
  • 如何在片段中实现 onBackPressed() 和意图?

    我知道 onBackPressed 是活动中的一种方法 但是 我想在片段中使用该功能 以便当按下后退按钮时 它会通过 Intent 重定向到另一个活动 有什么办法解决这个问题吗 public class News Events fragme

随机推荐

  • ASP.NET 用户控件类库

    是否可以创建包含 UserControls 的类库以便我可以重用它们 如果是这样 怎么办 标记是否与 dll 一起编译 谢谢你的帮助 您可以编译两者UserControls and Page进入类库 因为最终 这就是您的网站发布后发生的情况
  • 具有颜色渐变的 UIBezierPath

    我有一个关于 UIBezierPath 的问题 例如我有这条路径 现在我想要从白色到红色的颜色渐变 从左到右 这是我的代码 UIBezierPath bezierPath bezierPath UIBezierPath bezierPath
  • 使用 RVM 时如何安装 Ruby gems?

    我设置了 RVM 并用它来安装 Ruby 和其他一些库 当我浏览各种教程和其他技术 如 Rails 的设置时 我开始对我应该通过 RVM 做什么以及我应该按照教程建议做什么感到困惑 此处的 RubyGems 教程就是一个示例 http ru
  • scrapy如何制作自己的调度程序中间件

    我正在使用 Python 2 7 和 Scrapy 0 20 我的问题 如何构建我自己的调度程序 我尝试过的 我通过互联网阅读并发现了这一点 我必须创建自己的 python 类并使用 SCHEDULER MIDDLEWARES 在设置中分配
  • 生成不连续重复的随机数

    如何生成 0 4 之间的随机整数 并且不会连续两次生成相同的数字 例如 如果第一次生成的数字为3 则第二次随机生成的可能数字为0 1 2 4 如果第二次生成2 则第三次随机生成的可能数字为0 1 3 4 以此类推 int oldrand
  • Spring saml - 在 SP 上发起登录时如何记住请求参数,并在 IdP 响应后处理它们

    我想记住我的网站 SP 的第一个请求中的 url 请求参数 并在 IdP 响应后使用它们 我正在使用 spring saml 扩展并考虑 relayState 属性 但找不到如何使用请求中的参数构建它的示例 我需要在 sso 身份验证过程后
  • 时间复杂度 嵌套循环 内循环 + 外循环

    谁能解释一下这个算法的时间复杂度是多少 for i 1 i lt n i for j 1 j lt n j i note not j printf Iteration d d n i j The printf在内循环中称为exactly c
  • 相机2输出位图

    我正在尝试使用谷歌移动视觉API https developers google com vision barcodes overview使用camera2模块 我遇到了很多麻烦 我正在使用谷歌的android Camera2Video h
  • 使 google-chrome 浏览器在页面加载时全屏显示

    即使您将其标记为重复 也请考虑在此处回答此问题因为出于某种原因 我无法让它与其他解决方案一起使用 尽管我试图寻求帮助 但没有人回复 我真正想要的是 document ready function browser goes fullscree
  • PHP 中 MySQL 结果的分页

    直到最近我才真正考虑过这个 分页 作为一个问题 当我坐下来专注于它时 我发现自己面临很多问题 我感兴趣的是一个基本的联系人管理系统 用户可以在其中添加 更新 删除 搜索联系人 搜索部分是我需要有效实现分页的地方 我的想法 ve 和 ve 点
  • Google Apps 脚本 - JavaScript 不工作

    我创建了一个简单的网络应用程序 但它不起作用 Code gs function doGet I think this works var output HtmlService createTemplateFromFile index eva
  • 使用 Java 8 的 cobertura-maven-plugin

    是我一个人的问题还是 cobertura maven plugin 不适用于 java 8 当它运行时我得到 INFO cobertura maven plugin 2 6 instrument default provider impl
  • Oozie Shell Action 的 stdout 和 stderr 输出

    在 Oozie 站点中 它说 Shell 操作的 stdout 和 stderr 输出被重定向到运行 shell 命令的 Oozie Launcher 映射减少作业任务 STDOUT 谁能告诉我具体应该去哪里看 Oozie 在 启动器 中运
  • 递归是如何工作的? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 请用最简单的方式解释递归是如何工作的
  • Robotium:测试运行未能完成。预期 N 次测试,已收到 (N-1)

    Android 测试仍然是我头疼的问题 我创建了最简单的应用程序只是为了弄清楚如何Robotium有效 每次测试失败时都会出现错误 Running tests Test running started Test failed to run
  • subprocess.call cd 不起作用[重复]

    这个问题在这里已经有答案了 In 3 pwd Out 3 u Users aarcher Desktop scripts In 5 subprocess call mkdir p os path expanduser file path n
  • 防止在 C++ 中重新绘制窗口

    我正在编写一个全局钩子 DLL 它需要在窗口上使用 GDI 进行一些绘图以响应事件 我的问题是正在绘制的窗口不断重新绘制自身 因此我绘制的内容在我想要的之前就被删除了 有什么办法可以阻止窗户在我需要的时间内绘制任何东西吗 我的钩子目前是WH
  • PHP $_POST 只有 id,没有名称

    有人可以向我解释一下吗 我有以下代码
  • 如何为 CustomClipper 创建的小部件制作合适的边框和阴影

    我有一个Container里面的小部件ClipPath它使用一个CustomClipper 一切正常 我有所需的小部件形状 但是 我找不到为这个自定义形状的小部件制作阴影的方法 另外 我想要一个自动跟随此自定义小部件边缘的轮廓 边框 再次没
  • 不同的 ActionBar.Tab 使用不同的颜色

    我想让 ActionBar 中的所有选项卡都有不同的颜色指示器 例如选项卡 1 为蓝色 选项卡 2 为红色等 为了实现这一点 我为所有颜色创建了不同的选择器 并将它们放在可绘制的不同 xml 中 在 style xml 中我通过以下方式调用