杨子刚的博客


ActionBar初步

2013-12-10

Android 3.0(API level 11)出现了一个新的控件ActionBar,有了ActionBar,用户可以对当前界面提供的功能进行快捷操作。下面我们来学习一下如何使用ActionBar。

使用ActionBar要点:

创建菜单文件res/menu/main.xml

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

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"/>
    <item
        android:id="@+id/action_add"
        android:title="@string/action_add"/>
    <item
        android:id="@+id/action_delete"
        android:title="@string/action_delete"/>

</menu>

项目HelloActionBar

将Activity的菜单设置为main.xml定义的菜单(HelloActionBarActivity.java,18-19行)

package io.github.tianshanxuester.helloactionbar;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;

public class HelloActionBarActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

}

完成这些工作后,运行。

在Android 4.4模拟器上运行效果如下:

图1.

但是在Android 2.3.3真机上运行效果确实这样子:

图2.

图2.的效果是按下了手机上的menu按钮而弹出来的菜单,这个跟传统的菜单是没有区别的,不是我们想要的效果。之所以这样子是因为如果在Android 3.0之前的设备上存在menu按钮,那ActionBar上面就不显示那个展开菜单的按钮。

在3.0之前系统下运行

要想在新旧Android系统上App的行为相同,需要将res/menu/main.xml文件修改为:

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

    <item
        android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_light"
        android:title=""
        helloactionbardone:showAsAction="ifRoom">
        <menu>
            <item
                android:id="@+id/action_settings"
                android:title="@string/action_settings"/>
            <item
                android:id="@+id/action_add"
                android:title="@string/action_add"/>
            <item
                android:id="@+id/action_delete"
                android:title="@string/action_delete"/>
        </menu>
    </item>

</menu>

效果图:

美中不足的是,右上角的按钮被点击后,效果图如下:

响应菜单点击事件

需要在Activity中实现方法public boolean onOptionsItemSelected(MenuItem item):

HelloActionBarActivity.java:

24 @Override
25  public boolean onOptionsItemSelected(MenuItem item) {
26      switch(item.getItemId()) {
27      case R.id.action_add:
28          Log.i("SMSFilter", "action add");
29          break;
30      case R.id.action_settings:
31          Log.i("SMSFilter", "action setting");
32          break;
33      case R.id.action_delete:
34          Log.i("SMSFilter", "action delete");
35          break;
36      }
37      return true;
38  }

项目代码