【Android文档】Training-------Adding the Action Bar

转载请注明出处 :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中的另一篇




















郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。