Actionbar是android3.0的重要更新之一。Actionbar位于传统标题栏的位置,也就是显示在屏幕的顶部。
Actionbar提供了如下功能:
1.显示选项菜单optionsMenu的菜单项(Action Item)。
2.使用程序图标作为返回Home主屏或向上的导航操作。
3.提供交互式View作为Action View。
4.提供基于Tab的导航方式,可用于切换多个Fragment。
5.提供基于下拉的导航方式。
下面来看看Actionbar用于显示选项菜单以及Action View。
Activity类:
- package com.zzj.ui.actionbardemo;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import android.app.ActionBar;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- import android.view.ViewConfiguration;
- import android.view.Window;
- import android.widget.Toast;
- import com.zzj.ui.R;
- public class ActionbarActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.actionbar_activity);
- ActionBar actionBar = getActionBar();
- // 是否显示应用程序图标,默认为true
- actionBar.setDisplayShowHomeEnabled(true);
- // 是否显示应用程序标题,默认为true
- actionBar.setDisplayShowTitleEnabled(true);
- /*
- * 是否将应用程序图标转变成可点击的按钮,默认为false。
- *
- * 如果设置了DisplayHomeAsUpEnabled为true,
- *
- * 则该设置自动为 true。
- */
- actionBar.setHomeButtonEnabled(true);
- /*
- * 在应用程序图标的左边显示一个向左的箭头,
- *
- * 并且将HomeButtonEnabled设为true。
- *
- * 默认为false。
- */
- actionBar.setDisplayHomeAsUpEnabled(true);
- forceShowOverflowMenu();
- }
- /**
- * 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu
- */
- private void forceShowOverflowMenu() {
- try {
- ViewConfiguration config = ViewConfiguration.get(this);
- Field menuKeyField = ViewConfiguration.class
- .getDeclaredField("sHasPermanentMenuKey");
- if (menuKeyField != null) {
- menuKeyField.setAccessible(true);
- menuKeyField.setBoolean(config, false);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.actionbar_menu, menu);
- return super.onCreateOptionsMenu(menu);
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- /*
- * 将actionBar的HomeButtonEnabled设为ture,
- *
- * 将会执行此case
- */
- case android.R.id.home:
- finish();
- break;
- case R.id.add:
- Toast.makeText(this, "添加", Toast.LENGTH_LONG).show();
- break;
- // 其他省略...
- default:
- break;
- }
- return super.onOptionsItemSelected(item);
- }
- @Override
- public boolean onMenuOpened(int featureId, Menu menu) {
- setOverflowIconVisible(featureId, menu);
- return super.onMenuOpened(featureId, menu);
- }
- /**
- * 显示OverflowMenu的Icon
- *
- * @param featureId
- * @param menu
- */
- private void setOverflowIconVisible(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) {
- Log.d("OverflowIconVisible", e.getMessage());
- }
- }
- }
- }
- }
菜单文件res/menu/actionbar_menu.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <!-- action items -->
- <!-- showAsAction默认为never -->
- <item
- android:id="@+id/delete1"
- android:icon="@android:drawable/ic_menu_camera"
- android:showAsAction="always"
- android:title="拍照"/>
- <item
- android:id="@+id/add"
- android:icon="@android:drawable/ic_menu_add"
- android:showAsAction="ifRoom"
- android:title="添加">
- </item>
- <item
- android:id="@+id/delete2"
- android:icon="@android:drawable/ic_menu_edit"
- android:showAsAction="ifRoom"
- android:title="编辑"/>
- <item
- android:id="@+id/share"
- android:icon="@android:drawable/ic_menu_share"
- android:showAsAction="never"
- android:title="分享"/>
- <item
- android:id="@+id/call"
- android:icon="@android:drawable/ic_menu_call"
- android:showAsAction="never"
- android:title="呼叫"/>
- <item
- android:id="@+id/delete3"
- android:icon="@android:drawable/ic_menu_help"
- android:showAsAction="never"
- android:title="帮助"/>
- <!-- action views -->
- <item
- android:id="@+id/search"
- android:actionViewClass="android.widget.SearchView"
- android:showAsAction="always"
- android:title="查询"/>
- <item
- android:id="@+id/clock"
- android:actionLayout="@layout/actionbar_layout_menu"
- android:showAsAction="always"
- android:title="时钟"/>
- </menu>
- <?xml version="1.0" encoding="utf-8"?>
- <AnalogClock xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" >
- </AnalogClock>