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>时钟布局文件actionbar_layout_menu.xml:
<?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>效果:
代码解释见代码中的注释。