bigconvience的专栏

本文翻译了这篇文章:Using the Android action bar (ActionBar) – Tutorial

1、ActionBar的简介ActionBar位于Activity的顶部,可用来显示activity的标题、Icon、Actions和一些用于交互的View。它也可被用于应用的导航。ActionBar 是在Android 3.0(API 11)中加入到SK中的,想在低版本中使用ActionBar有两种选择:使用 或使用Support Library v7。下面是一张使用ActionBar的界面截图:

其中,[1]是ActionBar的图标,[2]是两个action按钮,[3]是overflow按钮

2、使用ActionBar

开发API11以下的程序,首先必须在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类,否则将无法使用ActionBar。

2.1 创建Actions

Actions即ActionBar中的每个交互项,可以在代码中创建Action,也可以在XML文件中指定(位于res/menu)。在menu资源文件中定义Action的方法如下:

<menu xmlns:android="" ><itemandroid:id="@+id/action_refresh"android:orderInCategory="100"android:showAsAction="always"android:icon="@drawable/ic_action_refresh"android:title="Refresh"/><itemandroid:id="@+id/action_settings"android:title="Settings"></item></menu> showAsAction属性用来定义每个Action是如何显示的,,always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。在Activity中创建ctionBar的Action代码位于onCreateOptionsMenu()中,下面一段代码展示了创建过程:@Override public boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.mainmenu, menu);return true; } 2.2 Action的按钮交互

如果一个Action被单击,对于activity中的onOptionsItemSelected()将被调用。该函数的传入参数是一个MenuItem。通过判断该MenuItem的Id,即可确认是哪个Action被单击。下面代码展示了该函数的使用过程。

Override public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {// action with ID action_refresh was selectedcase R.id.action_refresh:Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();break;// action with ID action_settings was selectedcase R.id.action_settings:Toast.makeText(this, "Settings selected", Toast.LENG.show();break;default:break;}return true; } onCreateOptionsMenu()只会被调用一次。若想改变Menu,可以调用invalidateOptionsMenu(),这会使onCreateOptionsMenu()将会再次被调用。3. 自定义ActionBar3.1 改变ActionBar的显示在运行时显示和隐藏ActionBar的方法如下:ActionBar actionBar = getActionBar();actionBar.hide();// more stuff here…actionBar.show(); 可以改变显示在程序图标旁边的文字,如下所示:ActionBar actionBar = getActionBar();actionBar.setSubtitle("mytest");actionBar.setTitle("vogella.com"); 3.2 隐藏导航按钮可以使用如下代码隐藏导航按钮。getWindow(). getDecorView(). setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 3.3 使用全屏模式对于Android 4.4 (API 19)应用程序可以使用全屏模式,如下面代码所示。// This method hides the system bars and resize the content private void hideSystemUI() {getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar// remove the following flag for version < API 19| View.SYSTEM_UI_FLAG_IMMERSIVE); } 3.4 使用Split action bar在屏幕很窄时(如在portra模式),使用Split action bar可以将所有的action显示在屏幕底部,这样可以讲更有意义的元素如导航、标题等显示在activity的顶部启用split action bar可在 AndroidManifest.xml中定义android:uiOptions="SplitActionBarWhenNarrow"4. 在Fragment中给action bar添加action在onCreate()中调用 setHasOptionsMenu(true)。Android Framework会调用Fragement中的onCreateOptionsMenu()来向Activity的Menu中添加item。

5. 动态设置action bar5.1. 自定义action bar中显示的View可以往action bar中添加自定义的View,如button或text。可以使用ActionView的setCustomView,然后使用setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM)来Enable自定义View。例子:先定义一个包含了EditText的布局文件。

<?xml version="1.0" encoding="utf-8"?><EditText xmlns:android=""android:id="@+id/searchfield"android:layout_width="match_parent"android:layout_height="match_parent"android:inputType="textFilter" ></EditText> 下面的代码将上述布局文件添加到了一个Activity的action bar中。package com.vogella.android.actionbar.customviews;import android.app.ActionBar;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.widget.EditText;import android.widget.TextView;import android.widget.TextView.OnEditorActionListener;import android.widget.Toast;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBar = getActionBar();// add the custom view to the action baractionBar.setCustomView(R.layout.actionbar_view);EditText search = (EditText) actionBar.getCustomView().findViewById(R.id.searchfield);search.setOnEditorActionListener(new OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId,KeyEvent event) {Toast.makeText(MainActivity.this, "Search triggered",Toast.LENGTH_LONG).show();return false;}});actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM| ActionBar.DISPLAY_SHOW_HOME); }} 完整的源码下载位置:自定义Android Action Bar的布局最糟糕的行为是抱怨,最易见效 的努力是从自己做起。

bigconvience的专栏

相关文章:

你感兴趣的文章:

标签云: