带有customView的Actionbar具有无法删除的额外填充

时间:2013-05-18 15:39:41

标签: android

无法使ActionBar显示具有适当样式的图标。

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

enter image description here

RES /菜单/ 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图像人员在图标周围留下了完全透明的搜索图标,但是所有其他图像都有一些浅色,这使得图标下方的额外填充非常明显。如果没有周围的轻微透明度,人们可能永远不会注意到,但我的客户希望填充消失。

enter image description here

RES /布局/ 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不是一个选项,因为该公司不需要第三方库

1 个答案:

答案 0 :(得分: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>

enter image description here

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


使用actionLayout

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

缺点是你必须使用OnClickListener或使用onClick属性来处理菜单项作为按钮而不是菜单项> View 即可。 onClick MenuItem属性不起作用。

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

menu.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"/>

enter image description here


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