默认情况下,操作栏出现在你的 activity 窗口的顶部,会稍微减少你的 activity 剩余部分的可用空间。在用户交互过程中,如果你想要隐藏和显示操作栏,你可以调用ActionBar
上的hide()
和show()
。但是,这会导致你的 activity 根据它的新的大小重算并重绘布局。
图 1. 相册的覆盖模式的操作栏。
为了避免在操作栏隐藏和显示时调整你的布局的大小,你可以为操作栏启用覆盖模式(overlay mode)。在覆盖模式下,你的 activity 布局使用所有可用空间,就像操作栏操作栏不在那里,系统在你的布局的前面绘制操作栏。这掩盖了布局顶部部分,但是现在当操作栏隐藏或出现时,系统不需要调整你的布局的大小,可以无缝地转变。
技巧:如果你想要你的布局在操作栏后面部分可见,你要为操作栏创建一个有部分透明的背景自定义样式,像 图 1 显示的那样。 更多关于怎样为操作栏定义背景的信息,参见为操作栏添加样式。
启用覆盖模式
为了让操作栏启用覆盖模式,你需要通过继承一个已存在的操作栏主题来创建一个自定义的主题,并把 android:windowActionBarOverlay
属性设为 true
。
只支持安卓 3.0或更高版本
如果你的 minSdkVersion
设置为11
或更高,你的自定义主题需要使用 Theme.Holo
主题(或它的一个子孙)作为你的父主题。例如:
<resources> <!-- the theme applied to the application or activity --> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo"> <item name="android:windowActionBarOverlay">true</item> </style> </resources>
支持安卓 2.1或更高版本
如果你的为了兼容运行比安卓 3.0低版本的设备而使用支持库,你的自定义主题需要使用 Theme.AppCompat
主题(或它的一个子孙)作为你的父主题。例如:
<resources> <!-- the theme applied to the application or activity --> <style name="CustomActionBarTheme" parent="@android:style/Theme.<strong>AppCompat</strong>"> <item name="android:windowActionBarOverlay">true</item> <!-- Support library compatibility --> <item name="windowActionBarOverlay">true</item> </style> </resources>
还需注意到,这个主题包含 windowActionBarOverlay
的两种定义方式:一种有android:
前缀而另一种没有。有 android:
前缀的用于平台有这个样式的安卓版本,没有前缀的用于从支持库中读取样式的老版本。
指定布局的顶部外边距
当操作栏是覆盖模式时,它肯定掩盖一些你的布局中需要保持可见的一部分。为了确保这些项在所有时候都在操作栏的下面,你需要使用 actionBarSize
指定的高度给视图顶部添加外边距或内边距。例如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?android:attr/actionBarSize"> ... </RelativeLayout>
如果你为操作栏使用支持库,你需要删除 android:
前缀。例如:
<!-- Support library compatibility --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?attr/actionBarSize"> ... </RelativeLayout>
在这种情况下,没有前缀的值 ?attr/actionBarSize
在所有版本上都可以工作,包括安装 3.0或更高版本。