Actionbar入门(二)

常用方法

        setDisplayHomeAsUpEnabled():当前activity的icon(即左上角处的图标)左侧处出现返回图标。相当于getActionBar().setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP);

        setHomeAsUpIndicator():修改返回图标,但api18起。解决方法可参考修改返回图标

        setCustomView():设置自定义actionbar,必须要设setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);否则无效。

        setDisplayShowCustomEnabled():是否可用自定义的layout做为actionbar。参数为true时对应的就是setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);。

        setDisplayShowHomeEnabled():是否显示actionbar左上角的icon/logo。true显示,false不显示。可以通过setIcon/setLogo()修改要显示的图标。

        setHomeButtonEnabled():左上角的icon/logo是否可点击。对应的id为android.R.id.home。

溢出菜单

        在别的一些应用中,经常看到在actionbar的最右边会出现一竖着排列的三个点(把有些功能选项给折叠起来了)里面放着一些操作选项,这被折叠起来的选项叫做溢出菜单(action overflow)。图如下:


        由于actionbar的长度是有限的。当空间不够时,如果手机没有物理菜单键,多余的action button(上图中有2)会自动收缩到action overflow(上图中的3)中。但是如果手机有物理菜单键,多余的菜单便不会出现action overflow。因此,需要在代码中关闭home键。

关闭home键

	public void closeMenu() {
		try {
			ViewConfiguration mconfig = ViewConfiguration.get(this);
			Field menuKeyField = ViewConfiguration.class
					.getDeclaredField("sHasPermanentMenuKey");
			if (menuKeyField != null) {
				menuKeyField.setAccessible(true);
				menuKeyField.setBoolean(mconfig, false);
			}
		} catch (Exception ex) {
		}
	}

        在上述的代码中是通过反射进行的,所以在某些手机上仍旧有可能无效。此时就需要自己模拟溢出菜单了。

模拟action overflow

        在一般情况下,一个actionbar只会显示三个action button。因此,我们可以把最后一个item里面放<menu>,这样点击第三个action button时就会弹出其中的<menu>。代码如:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:test="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action1_item1_item1"
        test:actionViewClass="android.support.v7.widget.SearchView"
        test:showAsAction="always"/>
    <item
        android:id="@+id/action1_item1_item5"
        android:title="页4"
        test:showAsAction="ifRoom">
    </item>
    <item
        android:id="@+id/action1_item1_item7"
        android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_light"
        test:showAsAction="ifRoom">
        <menu>
            <item
                android:id="@+id/action1_item1_item2"
                android:title="子页1"
                test:showAsAction="ifRoom"/>
            <item
                android:id="@+id/action1_item1_item3"
                android:title="子页2"
                test:showAsAction="ifRoom"/>
            <item
                android:id="@+id/action1_item1_item4"
                android:title="子页3"
                test:showAsAction="ifRoom"/>
        </menu>
    </item>
</menu>

        该布局的形成的actionbar效果为:最左边是一个放大镜(搜索功能),中间是一个"页4",最右边一个竖着排列的三个点,点开后便出现一个菜单,该菜单项有:子页1,子页2,子页3。

overflow显示icon

        默认时,overflow中的菜单是不显示图标的。也可以通过反射进行更改。如下:

	public boolean onMenuOpened(int featureId, Menu menu) {
		if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
			if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
				try {
					Method m = menu.getClass().getDeclaredMethod(
							"setOptionalIconsVisible", Boolean.TYPE);
					m.setAccessible(true);
					m.invoke(menu, true);
				} catch (Exception e) {
				}
			}
		}
		return super.onMenuOpened(featureId, menu);
	}
        重写onMenuOpened(),并利用反射调用MenuBuilder中的setOptionalIconsVisible,并传入参数true。

style与Theme

总述

        actionbar的theme必须是Theme.Holo或者Theme.AppCompat(使用support包时的theme)的子类。
        对于theme,谷歌提供了"dark"与"light"两种风格。其中Theme.Holo与Theme.AppCompat是"dark"风格的,而Theme.Holo.Light与Theme.AppCompat.Light是"light"风格的。当然,还有一些别的,如:actionbar是dark,但别的部分是light的Theme.AppCompat.Light.DarkActionBar和Theme.Holo.Light.DarkActionBar。

使用

v7包中引用style 

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat" >

系统3.0以上

    <application
        android:icon="@drawable/ic_launcher"
        android:label="demo"
        android:theme="@android:style/Theme.Holo.Light" >
        对比以上两者可以发现:v7包是直接@style,而下面的却是@android:style。其原因是前者定义在appcompat工程项目中的,因此在引用它的时候是直接@style/Theme.AppCompat,而后者是定义是系统中的
        有些时候需要自定义style,在自定义时一般都需要为style指定parent属性。这样我们就可以只更改其中某些属性,而不必把所有的属性都声明出来。

常用属性

在Theme.Holo中有一系列关于actionbar的设置。如下:
        actionBarSize:指定actionbar的高度。
        itemBackground:overflow中item的背景
        itemTextAppearance:overflow中item的字体样式,也即下图中“第四个”的样式。
        windowActionModeOverlay:指定actionbar是否处于overlay模式。
        actionBarStyle:actionbar的style,比较更改actionbar的背景等。
        actionButtonStyle:actionbar button的样式(figure1中的2),可以指定button点击时的背景
        actionOverflowButtonStyle:actionbar的overflow按钮(figure1的3)的style,可以用来更改overflow的按钮、背景等。
        actionBarItemBackground:api14以上。设置actionbutton与overflow button的背景。
        actionBarTabTextStyle:actionbar的标签的text样式
        actionMenuTextColor:当actionbutton显示文字时,该值用于指定文字的颜色。但它不影响overflow中的值。如下

修改actionbar背景

        我们需要重写android:actionBarStyle属性,并在该属性的值中修改android:background值。
3.0系统以上:
    <style name="AppBaseTheme" parent="@android:style/Theme.Holo">
        <item name="android:actionBarStyle">@style/CustomActionBarStyle</item>
    </style>

    <style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionBar">
        <item name="android:background">@drawable/action_bar_bg</item>
    </style>
使用v7包:
<!-- 修改android:actionBarStyle属性,使其指向自定义的一个style -->
    <style name="MyActionbar" parent="@style/Theme.AppCompat.Light">
        <!-- 在低版本中此处会报错,加上ignore属性忽略其报错即可。但是,此行不能不加,如果不加的话,在高版本上就没有效果了 -->
        <item name="android:actionBarStyle" tools:ignore="NewApi">@style/MyStyle</item>
        <!-- Support library compatibility -->
        <item name="actionBarStyle">@style/MyStyle</item>
    </style>
    <!-- 为自定义的style指定一个parent,并且修改其中的android:background,该值就是actionbar的背景 -->
    <style name="MyStyle" parent="@style/Widget.AppCompat.Light.ActionBar">
        <item name="android:background">@color/red</item>
        <item name="background">@color/red</item>
    </style>
        注意:必须得加上android:actionbarStyle属性,否则在高版本上就不会显示效果。而加上actionbarStyle是为了兼容低版本。
        通过上面的对比可以发现,用v7包和系统自带的不同之处在于:前者不但需要更改带android:前缀的属性,而且还需要更改不带前缀的属性,并且parent的值也不相同。
        在actionbarStyle中,还可以修改别的属性。下面是系统的一个actionbarStyle的值。
    <style name="Widget.Holo.ActionBar" parent="Widget.ActionBar">
        <item name="titleTextStyle">@style/TextAppearance.Holo.Widget.ActionBar.Title</item>
        <item name="subtitleTextStyle">@style/TextAppearance.Holo.Widget.ActionBar.Subtitle</item>
        <item name="background">@drawable/ab_transparent_dark_holo</item>
        <item name="backgroundStacked">@drawable/ab_stacked_transparent_dark_holo</item>
        <item name="backgroundSplit">@drawable/ab_bottom_transparent_dark_holo</item>
        <item name="divider">?attr/dividerVertical</item>
        <item name="progressBarStyle">@style/Widget.Holo.ProgressBar.Horizontal</item>
        <item name="indeterminateProgressStyle">@style/Widget.Holo.ProgressBar</item>
        <item name="progressBarPadding">32dip</item>
        <item name="itemPadding">8dip</item>
    </style>
        从中可以看出有titleTextStyle,也就是figure1中1右边的文字样式。因此,可以修改该属性从而更改相应的文字样式。如下:
    <style name="AppBaseTheme" parent="@android:style/Theme.Holo">
        <item name="android:actionBarStyle">@style/CustomActionBarStyle</item>
    </style>

    <style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionBar">
        <item name="android:background">@drawable/action_bar_overflow_bg_normal</item>
        <item name="android:titleTextStyle">@style/CustomTitleTextStyle</item>
    </style>
    <!--该style会作为android:titleTextStyle的值。根据官方文档说法,该style的parent应该是TextAppearance.Holo.Widget.ActionBar.Title,但是该style要求api是14,为了兼容11,就将parent改成TextAppearance。-->
    <style name="CustomTitleTextStyle" parent="@android:style/TextAppearance">
        <item name="android:textColor">#ff0000</item>
        <item name="android:textSize">10sp</item>
    </style>

修改action button点击背景

        在默认时,点击action button时背景颜色都会改变,但有时候系统自带的并不适合当前的整体效果,需要自己手动修改。如下:
    <style name="AppBaseTheme" parent="@android:style/Theme.Holo">
        <item name="android:actionButtonStyle">@style/CustomActionBarStyle</item>
    </style>

    <style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionButton">
        <!-- 设置为selector,点击时可以切换成自己想要的背景 -->
        <item name="android:background">@drawable/selector_action_bar_overflow_bg</item>
    </style>

修改overflow图标及点击背景

    <style name="AppBaseTheme" parent="@android:style/Theme.Holo">
        <item name="android:actionOverflowButtonStyle">@style/CustomActionBarStyle</item>
    </style>

    <style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow">
        <!-- overflow的图片 -->
        <item name="android:src">@drawable/overflow</item>
        <!-- overflow的背景,可以设置为selector。点击时可以切换成自己想要的背景 -->
        <item name="android:background">@drawable/selector_action_bar_overflow_bg</item>
    </style>

修改tab中文字样式

        actionbar  tab首先要修改android:actionBarTabTextStyle的值,最后修改该style中的android:textColor的值。
<!-- 应用到清单文件中的style -->
    <style name="MyActionbar" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
    </style>

    <style name="MyActionBarTabText" parent="@android:style/Widget.Holo.ActionBar">
        <item name="android:textColor">@android:color/white</item>
    </style>
        其中系统的一个style为:
    <style name="Widget.Holo.ActionBar.TabText" parent="Widget.ActionBar.TabText">
        <item name="textAppearance">@style/TextAppearance.Holo.Medium</item>
        <item name="textColor">?attr/textColorPrimary</item>
        <item name="textSize">12sp</item>
        <item name="textStyle">bold</item>
        <item name="textAllCaps">true</item>
        <item name="ellipsize">marquee</item>
        <item name="maxLines">2</item>
    </style>

示例

        仿微信的actionbar,具体的style文件如下:
<style name="AppBaseTheme" parent="@android:style/Theme.Holo">
        <item name="android:actionBarStyle">@style/CustomActionBarStyle</item>
        <item name="android:itemBackground">@drawable/selector_action_bar_overflow_item_bg</item>
        <item name="android:itemTextAppearance">@style/CustomItemTextAppearance</item>
        <item name="android:actionButtonStyle">@style/CustomActionButtonStyle</item>
        <item name="android:actionOverflowButtonStyle">@style/CustomActionOverflowButtonStyle</item>
    </style>

    <style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionBar">
        <item name="android:background">@drawable/action_bar_bg</item>
        <item name="android:titleTextStyle">@style/CustomABTitleTextStyle</item>
    </style>

    <style name="CustomABTitleTextStyle" parent="@android:style/TextAppearance">
        <item name="android:textColor">#dddddd</item>
        <item name="android:textSize">20sp</item>
    </style>

    <style name="CustomActionButtonStyle" parent="@android:style/Widget.Holo.ActionButton">
        <item name="android:background">@drawable/selector_action_bar_overflow_item_bg</item>
    </style>

    <style name="CustomActionOverflowButtonStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow">
        <item name="android:background">@drawable/selector_action_bar_overflow_button_bg</item>
        <item name="android:src">@drawable/overflow</item>
    </style>

    <style name="CustomItemTextAppearance" parent="@android:style/TextAppearance">
        <item name="android:textColor">#ff0000</item>
        <item name="android:textSize">20sp</item>
    </style>
效果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值