常用方法
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
总述
使用
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,而后者是定义是系统中的
。
常用属性
修改actionbar背景
<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是为了兼容低版本。
<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点击背景
<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中文字样式
<!-- 应用到清单文件中的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 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>
示例
<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>
效果如下: