【问题标题】:Is there a way to reduce the spacing between the Action Item Icons on Action Bar?有没有办法减少操作栏上操作项图标之间的间距?
【发布时间】:2023-03-07 07:33:01
【问题描述】:

我想减少添加到 ActionBar 的 Action Item 图标之间的间距。我们有办法做到这一点吗?

【问题讨论】:

  • 最佳答案对我来说似乎相当不错 - 没有被接受有什么原因吗?

标签: android


【解决方案1】:

使用自定义的 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。

【讨论】:

  • 在 API 级别 11 中不适合我。在 API 级别 14+ 中工作。
  • 要使用旧 API,我们还必须设置 @style/ActionButtonStyle
  • 请注意,在某些情况下,将 android:minWidth 设置为 0 会导致在长按 edittext 时崩溃。 (在 SGSII 等一些流行的设备上)
  • 56 dp 的默认 minWidth 是否适用于所有可绘制版本?
  • 我不知道该把&lt;item name="android:actionButtonStyle"&gt;@style/ActionButtonStyle&lt;/item&gt;放在哪里?
【解决方案2】:

对于 SDK 版本 17+,您应该使用 paddingStart 和 paddingEnd 属性,如果您的 minSdkVersion

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>

【讨论】:

  • 这应该是覆盖 17+ 设备的填充的正确方法。谢谢。
  • 这个对我有用!如果这有帮助,我在res/values/styles.xml&lt;style name="AppTheme" parent="Theme.AppCompat.Light"&gt; 元素中添加了一次&lt;item name="android:actionButtonStyle"&gt;@style/ActionButtonStyle&lt;/item&gt;。然后在两个styles.xml 文件中添加&lt;style name="ActionButtonStyle" ... 版本。 Android 将根据平台版本选择正确的 @style/ActionButtonStyle 定义。
  • 纠正我之前的评论:我实际上添加了&lt;item name="actionButtonStyle"&gt;@style/ActionButtonStyle&lt;/item&gt;(在默认styles.xml&lt;style name="ActionButtonStyle" parent="Widget.AppCompat.ActionButton"&gt;styles.xml(默认和v17)。见this answer
  • 没有 30dp 对我不起作用
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    要使用 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 及更高版本中工作,我还添加了带有 paddingStartpaddingEndres/values-v17/styles.xml 版本,正如 pedroca's answer 建议的那样。
    • 秘密是 30dp
    【解决方案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>
    

    【讨论】:

      【解决方案6】:

      我认为您可能会发现,如果不变得非常 hackish 或者只是创建自己的自定义 ActionBar,这很难实现。 See here 似乎是一个非常相似的问题。我做了一些测试自己覆盖了 android:actionButtonStyle,虽然我能够覆盖某些东西(比如背景),但它拒绝遵守我指定的任何类型的填充属性。

      【讨论】:

      • 感谢 Hankystyles 的链接,我尝试覆盖 android:actionButtonStyle ,但也无法更改背景。这就是我的做法。 '代码'( ) 'code' 然后我尝试覆盖android: selectableItemBackground 也可以工作。
      【解决方案7】:

      没有一个答案对我有用。所以我使用 layer-list 将图标包装在一个可绘制的 xml 中,并给它一个负的左边距,它对我有用。

      <?xml version="1.0" encoding="utf-8"?>
      <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:left="-20dp">
              <bitmap
                  android:src="@drawable/actionbar_logo"
                  android:gravity="left" />
          </item>
      </layer-list>
      

      【讨论】:

        【解决方案8】:

        如果您正在创建自定义 ActionBar,您可以在元素之间添加自定义间距,如果您想将项目彼此靠近,您可以为属性使用负值。就像这个伪代码(在你的布局 xml 文件中):

        <ImageView 
        android:layout_marginLeft="-2dp"
        

        【讨论】: