在 Android 4 上自定义 ActionBar 选项卡

Posted

技术标签:

【中文标题】在 Android 4 上自定义 ActionBar 选项卡【英文标题】:Customizing ActionBar Tabs on Android 4 【发布时间】:2012-05-03 14:35:49 【问题描述】:

我正在尝试自定义 ActionBar 上的选项卡。我只想将标签与手机屏幕对齐,并使其可伸缩以适应各种屏幕。但我得到的只是:

我用于主题的代码是这样的:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="MyTheme" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarTabTextStyle">@style/MyActionBarTabTextStyle</item>
    </style>

    <style name="MyActionBarTabTextStyle" parent="@android:style/Widget.Holo.Light.Tab">
        <item name="android:textSize">14dip</item>
        <item name="android:padding">0dip</item>
    </style>

</resources>

是否有可能只是减少字体并去掉那些蓝线?

提前感谢您的帮助。

P.S.:Button 的行为也很奇怪。没有文本(虽然它应该是)...

【问题讨论】:

只是为了澄清一下,当您说“只想将标签与手机屏幕对齐并使其可在各种屏幕上拉伸”时,您是否希望标签文本始终显示在标签中的一行上,选项卡水平拉伸以便为文本腾出空间? 不,标签文本可以是 2 行或 3 行,但我希望标签填满屏幕的宽度(纵向,横向就可以了,就像现在一样)。看标签三,你只能看到它的一半......前两个标签太宽了,它们不应该,所以我想降低字体大小和标签宽度以适应它(我会喜欢对标签宽度(或标签)使用某种“百分比度量”,而不是固定的,比如 px)。 【参考方案1】:

编辑:在支持库中使用ActionBarCompat


我建议你使用 Jake Wharton 的 ActionBarSherlock 有两个原因:

    ActionBarSherlock 是兼容性库的扩展,有助于在所有 Android 版本中使用操作栏。这意味着在 HoneyComb 之前的 Android 版本上运行您的应用程序的用户也可以使用ActionBar 进行导航。这对用户(因为ActionBar 太棒了!)和您(因为您不必担心根据ActionBar 是否可用来分离应用程序的控制流)都更可取。例如,如果没有预 HoneyComb 兼容的ActionBar,您可能不得不担心为单个屏幕创建多个Activitys……一个针对ActionBar 的使用进行了优化,一个可以运行在 HoneyComb 之前的设备上。

    有了 ActionBarSherlock,styling 你的 ActionBar 很简单!我可以详细介绍如何做到这一点,但该库已经附带了很多 sample code 来说明您在上面描述的内容。

安装/使用该库非常简单,几乎与使用 Android SDK 中提供的普通ActionBar 相同(通常只调用getSupportActionBar() 而不是getActionBar())。如果您有任何问题,请告诉我。

附言另请注意,ActionBarSherlock 提供了 ViewPagerExtensions 库提供的所有功能等等。我肯定会推荐使用前者而不是后者。

【讨论】:

Jake Worton 不建议任何人在你的目标是 android 4+ 时使用 actionbar sherlock @just_user 我在ActionBarCompat 发布前一年写了这个答案。你应该改用ActionBarCompat【参考方案2】:

有一个全新的工具可以为操作栏生成正确的 9patch 图像:http://jgilfelt.github.com/android-actionbarstylegenerator/

【讨论】:

【参考方案3】:

我发现使用选项卡的样式指南对于蜂窝非常不一致,只为你想要的自定义视图充气要容易得多。

Fragment serivceFrag = new ServicesFragment();
Tab serviceTab = bar.newTab();
TextViewPlus serviceTabTextView =(TextViewPlus)getLayoutInflater().inflate(R.layout.tab_item_layout, null);
serviceTabTextView.setText(servicesLabel);
serviceTab.setCustomView(serviceTabTextView);
serviceTab.setTabListener(new TabListenerFragment(serivceFrag,"Service",R.id.MainInfoPaneFragment));
bar.addTab(serviceTab);

这对我来说要简单得多,

【讨论】:

【参考方案4】:

改为:

<style name="MyActionBarTabTextStyle" parent="@android:style/Widget.Holo.ActionBar.TabText">
     <item name="android:textSize">14dip</item>
     <item name="android:padding">0dip</item>
</style>

【讨论】:

【参考方案5】:

我认为您继承了错误的样式,请尝试:

<style name="MyActionBarTabTextStyle" parent="android:TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textSize">14sp</item>
    <item name="android:padding">0dip</item>
</style>

编辑:另外,请确保您使用 sp 而不是 dip 字体大小(14sp)

【讨论】:

【参考方案6】:

我强烈推荐你使用ViewPagerExtensions library,它为你提供了 5 种不同样式的标签供你选择,而且你必须在纵向和横向填充标签的问题,每个屏幕尺寸的 ode 已经在这个库中解决了.

顺便说一句,如果您查看库的代码,您可以自己简单地设置主题。

另外,如果您在使用片段页面时遇到问题,请查看actionbarsherlock-tabs-multi-fragments

【讨论】:

【参考方案7】:

您可以使用setCustomView 方法。

【讨论】:

以上是关于在 Android 4 上自定义 ActionBar 选项卡的主要内容,如果未能解决你的问题,请参考以下文章

令牌服务器上自定义端点的 Identity Server 4 客户端凭据

在 iOS 上自定义 session_start 事件参数

在视图上自定义多个手势

在 didFinishLaunching 上自定义视图控制器堆栈

在 iframe 上自定义 css [重复]

使用 Swift 3 在 UICollectionView 上自定义布局