有没有办法减少操作栏上操作项图标之间的间距?

44

我想要减少添加到操作栏的操作项图标之间的间距。我们有什么方法可以做到这一点吗?


1
这个最佳答案对我来说看起来相当不错,有没有什么原因它还没有被采纳呢? - andygeers
8个回答

69

使用自定义的android:actionButtonStyle。

<item name="android:actionButtonStyle">@style/ActionButtonStyle</item>

这就是魔法所在:

<style name="ActionButtonStyle" parent="@android:style/Widget.Holo.Light.ActionButton">
    <item name="android:minWidth">0dip</item>
    <item name="android:paddingLeft">0dip</item>
    <item name="android:paddingRight">0dip</item>                  
</style>

通常情况下,minWidth 被设置为 56 dip。


6
为了使用旧的API,我们还需设置<item name="actionButtonStyle">@style/ActionButtonStyle</item>。 - Blue Smith
请注意,在某些情况下(例如在一些流行的设备上,如SGSII),将android:minWidth设置为0会导致长按edittext时崩溃。 - Andreas Petersson
如何在工具栏上使用它? - Makalele
5
我不确定在哪里放置 <item name="android:actionButtonStyle">@style/ActionButtonStyle</item>,请问应该放在哪里? - blueprintchris
这个能否应用到单个项目上? - androidguy
显示剩余5条评论

17

对于SDK版本17及以上,您应该使用paddingStart和paddingEnd属性。如果您的minSdkVersion < 17,则必须为每个版本使用不同的样式,例如:

res/values/styles.xml :

<item name="android:actionButtonStyle">@style/ActionButtonStyle</item>

<style name="ActionButtonStyle" parent="@android:style/Widget.Holo.Light.ActionButton">
    <item name="android:minWidth">0dip</item>
    <item name="android:paddingLeft">0dip</item>
    <item name="android:paddingRight">0dip</item>                  
</style>

res/values-v17/styles.xml :

<item name="android:actionButtonStyle">@style/ActionButtonStyle</item>

<style name="ActionButtonStyle" parent="@android:style/Widget.Holo.Light.ActionButton">
    <item name="android:minWidth">0dip</item>
    <item name="android:paddingStart">0dip</item>
    <item name="android:paddingEnd">0dip</item>                  
</style>

1
这应该是覆盖17+设备填充的正确方法。谢谢。 - jaxvy
这个对我奏效了!如果有帮助的话,我只在res/values/styles.xml文件中一次添加了<item name="android:actionButtonStyle">@style/ActionButtonStyle</item>,并将其放置在我的<style name="AppTheme" parent="Theme.AppCompat.Light">元素内。然后在两个styles.xml文件中都加入了<style name="ActionButtonStyle"...版本。Android将根据平台版本选择正确的@style/ActionButtonStyle定义。 - Ferran Maylinch
更正我的上一条评论:实际上我添加了 <item name="actionButtonStyle">@style/ActionButtonStyle</item>(在默认的 styles.xml 中)和 <style name="ActionButtonStyle" parent="Widget.AppCompat.ActionButton">(在 styles.xml 中,包括默认和 v17 版本)。请参见此答案 - Ferran Maylinch
1
没有 <item name="android:maxWidth">30dp</item>,它对我没用。 - Abigail La'Fay

15

感谢Shai的提示,这对我非常有用(在一个Android 4.0.x设备上): (我的整个style.xml)

<resources xmlns:android="http://schemas.android.com/apk/res/android">

<!--
    Base application theme, dependent on API level. This theme is replaced
    by AppBaseTheme from res/values-vXX/styles.xml on newer devices.

-->
<style name="AppBaseTheme" parent="android:Theme.Light">
    <!--
        Theme customizations available in newer API levels can go in
        res/values-vXX/styles.xml, while customizations related to
        backward-compatibility can go here.

    -->
</style>

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">

    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="android:actionButtonStyle">@style/ActionButtonStyle</item>
</style>

<style name="ActionButtonStyle" parent="@android:style/Widget.Holo.Light.ActionButton">
    <item name="android:minWidth">0dip</item>
    <item name="android:paddingLeft">0dip</item>
    <item name="android:paddingRight">0dip</item>
</style>


12

如果要支持旧版本使用appCompat,您只需要做如下操作:

在您的应用程序的appTheme中:

<item name="actionButtonStyle">@style/ActionButtonStyle</item>

并在 style.xml 中创建一个样式

 <!--this will reduce space between actionBar Icons-->
    <style name="ActionButtonStyle" parent="Widget.AppCompat.ActionButton">
        <item name="android:minWidth">0dip</item>
        <item name="android:maxWidth">50dip</item>
        <item name="android:paddingLeft">0dip</item>
        <item name="android:paddingRight">0dip</item>
    </style>

完成了,你做到了。


为了使其在v17及以上版本中正常工作,我还添加了res/values-v17/styles.xml版本,并按照pedroca的答案建议设置了paddingStartpaddingEnd - Ferran Maylinch
秘密就在于<item name="android:maxWidth">30dp</item>。 - Abigail La'Fay

5
在 appTheme 中添加。
<item name="actionButtonStyle">@style/CustomActionButtonStyle</item>

然后在style.xml文件中创建以下样式:

<style name="CustomActionButtonStyle" parent="Widget.AppCompat.ActionButton">
        <item name="android:paddingStart">0dip</item>
        <item name="android:paddingEnd">0dip</item>
    </style>

1

我认为你会发现,如果不采用极端的hackish方法或者创建自己的自定义ActionBar,这将是难以实现的。在这里看看一个非常相似的问题。我自己进行了一些测试,覆盖了android:actionButtonStyle,虽然我能够覆盖某些东西(比如背景),但它拒绝遵守我指定的任何填充属性。


1
感谢Hankystyles提供的链接,我尝试重写android:actionButtonStyle,但是无法改变背景。这是我的做法。 'code'(<style name="customactionbuttonstyle" parent="@android:style/Widget.Holo.ActionButton"> <item name="android:background">@drawable/selectableitem_selector</item> </style>