3

无法让 ActionBar 显示具有正确样式的图标。

我的客户想要一个具有不同透明度的特定图标的 ActionBar。如果我只是将图标放入 res/menu 中的 XML 文件中,那么我无法让图标彼此相邻,并且每个图标的背景会导致垂直间隙,如下所示:

在此处输入图像描述

res/menu/global_nav.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/menu"
    android:icon="@drawable/ic_main_menu"
    android:showAsAction="always"
    android:title="@string/nav_menu_main"/>  

<item
    android:id="@+id/login"
    android:icon="@drawable/ic_people"
    android:showAsAction="always"
    android:title="@string/nav_menu_login"/>
<item
    android:id="@+id/location"
    android:icon="@drawable/ic_location"
    android:showAsAction="always"
    android:title="@string/nav_menu_location"/>

等等等等

因此,我创建了一个 customView 并简单地将相同的图标放置在一个 RelativeLayout 中。这使图标排列得更好,并且不会在图标之间留下空隙。我可以更轻松地设计它,即使我失去了使用上述菜单的能力。但是,它会在 PagerTitleStrip 上方的图标行底部留下一个空隙。人们离开搜索图标的 UX 图像在图标周围完全透明,但所有其他图像都有一些浅色,这使得图标下方的额外填充非常明显。如果没有它们周围的轻微透明度,人们可能永远不会注意到,但我的客户希望那个填充物消失。

在此处输入图像描述

res/layout/global_nav_custom.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"
android:background="@color/att_blue"
android:paddingBottom="-54dp"
android:orientation="horizontal" >

<ImageView
    android:id="@+id/menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:src="@drawable/ic_main_menu" />

<ImageView
    android:id="@+id/search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="false"
    android:layout_alignParentRight="true"
    android:src="@drawable/ic_search" />

<ImageView
    android:id="@+id/message"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/search"
    android:src="@drawable/ic_message" />

<ImageView
    android:id="@+id/cart"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/message"
    android:src="@drawable/ic_cart" />

<ImageView
    android:id="@+id/location"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/cart"
    android:src="@drawable/ic_location" />

<ImageView
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/location"
    android:src="@drawable/ic_people" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/menu"
    android:layout_marginLeft="364dp"
    android:layout_toRightOf="@+id/menu"
    android:text="@string/app_name"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@android:color/white" />

</RelativeLayout>

Java 代码

    ActionBar bar = getActionBar();
    bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

    LayoutInflater li = LayoutInflater.from(this);
    View customView = li.inflate(R.layout.global_nav_custom, null);


    bar.setCustomView(customView);

所以,我的问题是 A) 我如何设置 ActionBar 的样式以使用标准样式 XML 作为菜单但消除垂直间隙。或者 B) 使用 customView 解决方案,我在底部得到 4+ 像素的间隙。

顺便说一句,ActionBarSherlock 不是一个选项,因为公司不希望第三方库

4

1 回答 1

2

使用标准动作按钮

您可以通过为您的应用程序使用自定义主题来使用标准操作按钮来实现此目的。
注意:为此,您的图标必须为32dp或更小

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyAppTheme" parent="android:Theme.Holo.Light">
        <item name="android:actionButtonStyle">@style/ActionButton</item>
        <item name="android:actionBarSize">32dp</item>
    </style>

    <style name="ActionButton" parent="android:Widget.ActionButton">
        <item name="android:paddingStart">0dp</item>
        <item name="android:paddingEnd">0dp</item>
        <item name="android:paddingLeft">0dp</item>
        <item name="android:paddingRight">0dp</item>
        <item name="android:minWidth">0dp</item>
    </style>
</resources>

在此处输入图像描述

不要忘记编辑您的 AndroidManifest 以设置您的活动/应用程序的主题;)


使用动作布局

另一种方法是actionLayout为每个操作项指定一个。这样您就可以随意保留您的图标,并将操作栏大小保持为48dp

缺点是您必须通过使用 aOnClickListener或使用onClick. ViewonClick属性MenuItem将不起作用。

您还应该在用户长按项目时显示菜单标题,就像标准操作按钮一样。

菜单.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/menu"
        android:actionLayout="@layout/widget_main_button"
        android:showAsAction="always"
        android:title="main"/>
    <item
        android:id="@+id/login"
        android:actionLayout="@layout/widget_login_button"
        android:showAsAction="always"
        android:title="login"/>
    <item
        android:id="@+id/location"
        android:actionLayout="@layout/widget_location_button"
        android:showAsAction="always"
        android:title="location"/>
</menu>

widget_main_button.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menu_main_button"
    android:layout_width="@dimen/action_button_width"
    android:layout_height="?android:actionBarSize"
    android:background="@drawable/ic_main_menu"/>

在此处输入图像描述


Jeff Gilfelt的Android Resource Navigator是一个有用的 android 应用程序样式工具。这是一个 Chrome 扩展程序,可让您快速浏览默认的 Android 主题和样式以找到需要更改的内容。

于 2013-05-18T16:26:38.020 回答