转载请注明出处 :http://blog.csdn.net/chziroy/article/details/44171197
本文主要翻译android开发官网Training中关于ActionBar的几篇文章
Setting up the Action Bar
在大多最基本的格式中,action bar都会呈现activity的标题以及在左侧呈现app的图标。它能使用户知道当前处于哪个activity,并且使该app有一个持久的标志。如下图
要使用action bar需要app的activity使用带有action bar的主题(theme),theme与你的app支持的最低版本有关。本文只讲android3.0以上(API >= 11)的情况。(原文有讲解如何适配3.0以下,窃以为:现在2.3,2.2版本的设备真的太少太少了,有需要的时候再为它们做适配吧,学习的时候直接学习3.0以上的)
Support Android 3.0 and Above Only
从Android3.0(API level 11)开始,所有activity都默认包含action bar,并且这些action bar使用Theme.Holo主题或者其子主题。所以如果想在所有activity中使用action bar,只需将app的targetSdkVersion以及minSdkVersion设置为11及以上,如下
<manifest ... > <uses-sdk android:minSdkVersion="11" ... /> ... </manifest>
注意,如果你自定义一个主题,该自定义主题需要继承自Theme.Holo。好了,通过以上设置,Theme.Holo主题就被设置到你整个app的所有activity中了。
Adding Action Buttons
action bar上可以添加与当前上下文相关的动作按钮。比较重要的按钮可以直接呈现在action bar上,不够重要的按钮则放在overflow中,如下图
Specify the Actions in XML
要为action bar添加按钮,可以在menu文件夹中新建一个xml文件,在其中定义<item>,如下
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- Search, should appear as action button --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" android:showAsAction="ifRoom" /> <!-- Settings, should always be in the overflow --> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:showAsAction="never" /> </menu>
此处,当action bar控件足够时,Search action按钮将直接呈现在action bar上,而如果Setting action会一直隐藏在overflow中。默认情况所有action都是在overflow中的,但是官方建议最好自己为各个item声明位置。
Add the Actions to the Action Bar
如何将上面声明的menu items添加到action bar呢?你可以实现activity的onCreateOptionMenu()来将某个menu资源文件inflate到该方法的Menu参数对象中。如下:
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_activity_actions, menu); return super.onCreateOptionsMenu(menu); }
Respond to Action Buttons
响应action bar中各个按钮的事件,只需重写activity的onOptionsItemSelected()方法,如下
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_search: openSearch(); return true; case R.id.action_settings: openSettings(); return true; default: return super.onOptionsItemSelected(item); } }
Add Up Button for Low-level Activities
所有不是app入口的activity都需要提供一个向上返回的功能。如下图
在Android 4.1(API level 16)开始,你只需要在manifest中为activity声明一个parent activity即可。如下
<application ... > ... <!-- The main/home activity (it has no parent activity) --> <activity android:name="com.example.myfirstapp.MainActivity" ...> ... </activity> <!-- A child of the main activity --> <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application>
如果是在4.1及以上版本,则只需使用parentActivityName,以上的meta-data是针对4.0及之下的版本。但是为了兼容,其实可以一直都把两个一起写。
然后在activity代码中调用setDisplayHomeAsUpEnabled():,使app的图标作为向上返回的按钮,如下:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_displaymessage); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // If your minSdkVersion is 11 or higher, instead use: // getActionBar().setDisplayHomeAsUpEnabled(true); }
Styling the Action Bar
Android提供了一些内建的action bar主题,你也可以在这些主题的基础上个性化定制自己的action bar主题
Use an Android Theme
android提供了两个基本的主题
- Theme.Holo:一个褐色的主题
- Theme.Light:一个白色的主题
你可以在<application>中将主题设定给所有activity,也可以在<activity>中将主题指定给某个activity。如下:
<application android:theme="@android:style/Theme.Holo.Light" ... />
你也可以使用黑色头部,白色主题的主题:Theme.Holo.Light.DarkActionBar
Customize the Background
一般通过重写主题的background可以自定义action bar的样式,如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- the theme applied to the application or activity --> <style name="CustomActionBarTheme" parent="@style/Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <!-- ActionBar styles --> <style name="MyActionBar" parent="@style/Widget.Holo.Light.ActionBar.Solid.Inverse"> <item name="android:background">@drawable/actionbar_background</item> </style> </resources>
然后将该主题应用到整个app中:
<application android:theme="@style/CustomActionBarTheme" ... />
使用了navigation tabs 或者 split action bar,的action bar,也可以使用 backgroundStacked 和 backgroundSplit指定主题样式。
Customize the Text Color
与修改背景类似,修改字体颜色也只需修改对应属性即可,一般可以修改以下三个
Action bar title:使用titleTextStyle
Action bar tabs:使用 actionBarTabTextStyle
Action buttons:使用 actionMenuTextColor
如下:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- the theme applied to the application or activity --> <style name="CustomActionBarTheme" parent="@style/Theme.Holo"> <item name="android:actionBarStyle">@style/MyActionBar</item> <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item> <item name="android:actionMenuTextColor">@color/actionbar_text</item> </style> <!-- ActionBar styles --> <style name="MyActionBar" parent="@style/Widget.Holo.ActionBar"> <item name="android:titleTextStyle">@style/MyActionBarTitleText</item> </style> <!-- ActionBar title text --> <style name="MyActionBarTitleText" parent="@style/TextAppearance.Holo.Widget.ActionBar.Title"> <item name="android:textColor">@color/actionbar_text</item> </style> <!-- ActionBar tabs text styles --> <style name="MyActionBarTabText" parent="@style/Widget.Holo.ActionBar.TabText"> <item name="android:textColor">@color/actionbar_text</item> </style> </resources>
Customize the Tab Indicator
主要是讲按下和松开的背景变化,容易理解,但是表述冗长,暂且不写
Overlaying the Action Bar
Action Bar会默认处于activity视图的顶端,一定程度上因此缩小了activity的布局大小。在用户交互过程中,你可以使用ActionBar的hide()或者show()来隐藏或者显示action bar。但是因此会导致系统重新计算activity的大小并重绘。为了避免actionbar在调用hide()或show()时activity的大小发生变化,可以把action bar设置为overlay的模式,该模式下action bar不会占据activity的空间,而是在activity的上层,并可能遮住activity的部分内容。但是这样在activity调用hide()或者show()时就不会改变其大小了。(如果为避免在overlay模式下action
bar会遮住activity的部分内容,可以将action bar设置为透明)
Enable Overlay Mode
使用overlay模式,只需使用android:windowActionBarOverlay属性,将其设置为true即可。如下(本文讲解的所有代码都只针对android3.0以上)
<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>
Specify Layout Top-margin
如果想在overlay的模式下不让actionbar遮住activity,可以通过设置activity的marginTop或者paddingTop设置为action bar的高度。如下
<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>
先翻译一篇,后面再翻译官网API Guide中的另一篇