Android ActionBar的基本用法

article/2025/11/7 0:54:43

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

1、ActionBar的简介
ActionBar位于Activity的顶部,可用来显示activity的标题、Icon、Actions和一些用于交互的View。它也可被用于应用的导航。
ActionBar 是在Android 3.0(API 11)中加入到SK中的,想在低版本中使用ActionBar有两种选择:使用http://actionbarsherlock.com 或使用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="http://schemas.android.com/apk/res/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()中,下面一段代码展示了创建过程:

@Overridepublic 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被单击。下面代码展示了该函数的使用过程。

Overridepublic 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. 自定义ActionBar
3.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 contentprivate 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 bar
5.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="http://schemas.android.com/apk/res/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 {@Overrideprotected 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的布局

5.2. Action View
Action View控件可以替换Action bar的Action按钮图标。可以利用这个特点将某个Action项替换成一个ProgressBar。可通过android:actionLayout或android:actionViewClass来定义一个布局文件或Widg来作为Action的action view。
Action View使用的效果图如下。




首先是两个布局文件,第一个用于action view

<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/progressBar2"android:layout_width="wrap_content"android:layout_height="wrap_content"></ProgressBar> 
第二个用于menu设置

<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/menu_settings"android:orderInCategory="100"android:showAsAction="always"android:title="Settings"/><itemandroid:id="@+id/menu_load"android:icon="@drawable/navigation_refresh"android:orderInCategory="200"android:showAsAction="always"android:title="Load"/></menu> 
Activity的代码如下:

package com.vogella.android.actionbar.progress;import android.app.ActionBar;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;public class MainActivity extends Activity {private MenuItem menuItem;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBar = getActionBar();actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME| ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_load:menuItem = item;menuItem.setActionView(R.layout.progressbar);menuItem.expandActionView();TestTask task = new TestTask();task.execute("test");break;default:break;}return true;}private class TestTask extends AsyncTask<String, Void, String> {@Overrideprotected String doInBackground(String... params) {// Simulate something long runningtry {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(String result) {menuItem.collapseActionView();menuItem.setActionView(null);}};
} 
完整源码的下载地址: 动态改变ActionBar的图标
6. Action Provider
Action Provider提供了在单个组件里提供多种交互方式的方法。它可以用来创建action view,动态弹出子menu,处理action调用事件。基类为ActionProvider
目前Android平台提供两种action provider:MediaRouteActionProvider和ShareActionProvider。
下面以一个例子计算ShareActionProvider的用法。使用这个action provider可以让程序从注册了Intent.ACTION_SEND的Intent中获取。
首先定义Menu XML文件,并设置Item的android:actionProviderClass="android.widget.ShareActionProvider"

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/menu_share"android:title="Share"android:showAsAction="ifRoom"android:actionProviderClass="android.widget.ShareActionProvider" /><itemandroid:id="@+id/item1"android:showAsAction="ifRoom"android:title="More entries..."></item></menu> 
设置一个包含了想要共享数据的Intent,将其发送。

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);// Get the ActionProvider for later usageprovider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_share:doShare();break;default:break;}return true;  }public void doShare() {// populate the share intent with dataIntent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, "This is a message for you");provider.setShareIntent(intent);} 
7. 使用程序图标导航
7.1. 使用程序图标作为home icon
Action Bar的左侧图标称为home icon,可为这个图标设置一个Action。推荐做法是当按了这个图标,返回到Home Activity中。
下面的代码介绍了在Android4.1前的版本上使用home aciton。关键点是在onOptionsMenuItemSelected() 中使用android.R.id.home并启用actionbar的HomeIcon。SecondActivity将MainActivity作为HomeActivity。
package com.vogella.android.actionbar.homebutton;import android.os.Bundle;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;public class SecondActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// enable the home buttonActionBar actionBar = getActionBar();actionBar.setHomeButtonEnabled(true);//或者使用actionBar.setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:Intent intent = new Intent(this, MainActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);break;// Something elsecase R.id.action_settings:intent = new Intent(this, ThirdActivity.class);startActivity(intent);default:break;}return super.onOptionsItemSelected(item);}}
在Android 4.1以上版本,可以按如下的方式在AndroidManifest.xml中设置parentActivityName属性。
完整代码下载地址: 使用ActionBar的HomeIcon进行导航

上面是关于ActionBar的一些基本用法。由于ActionBar经常会和其它控件如Drawer,Tab等控件联合使用,之后我会写一篇文章介绍ActionBar与其它控件的搭配用法并提供源代码作为备用。


http://chatgpt.dhexx.cn/article/TiIRX5ft.shtml

相关文章

Android UI开发详解之ActionBar

在Android3.0之后&#xff0c;Google对UI导航设计上进行了一系列的改革&#xff0c;其中有一个非常好用的新功能就是引入的ActionBar&#xff0c;他用于取代3.0之前的标题栏&#xff0c;并提供更为丰富的导航效果。 一、添加ActionBar 1、不需要导入ActionBar&#xff0c;因为…

超详细!ActionBar使用详解

转自:https://www.cnblogs.com/mjsn/p/6150824.html 一、ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外&#xff0c;Action Bar也是一个非常重要的交互元素&#xff0c;Action Bar取代了传统的tittle bar和menu&#xff0c;在程序运行中一直置于顶部&#xff0c…

ActionBar

ActionBar是3.0之后出现的控件&#xff0c;取代menu&#xff0c;显示在标题栏位置。根据我的经验&#xff0c;menu尽量不要使用&#xff0c;很多用户都是小白&#xff0c;根本就不知道menu这个按键有什么用&#xff0c;也不会去点击这个按键。 通过getActionBar()得到对象。 …

什么是ActionBar

原文地址:http://www.2cto.com/kf/201307/229693.html 一、什么是ActionBar 有图有真相&#xff0c;看一下图片就了解的差不多了 对于大多数应用&#xff0c;操作栏可以分割为 4 个不同的功能区域。 1. 应用图标 应用图标是您应用的标志。在应用图标位置摆放您自己的 logo。注意…

Android ActionBar应用实战,高仿微信主界面的设计

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习&#xff0c;我想大家对ActionBar都已经有一个相对较为深刻的理解了。唯一欠缺的是&#xff0c;前面我们都只是学习了理论知识而已&#xff0c;虽然知识点已经掌握…

Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc&#xff0c;我翻译之后又做了些加工&#xff0c;英文好的朋友也可以直接去读原文。 http://developer.android.com/guide/topics/ui/actionbar.html…

Android学习:ActionBar简介

目录 PART1:介绍 PART2&#xff1a;系统默认Actionbar用法简介 1.在onCreate中设置Actionbar 2 . **为Actionbar添加菜单项 ** 3 . Actionbar样式自定义 4.导航栏结构 5.ActionBar中添加下拉菜单 6.配置导航栏 PART1:介绍 ActionBar是Android 3.0以后Anrdoid系统增加的…

栈与队列的区别

1、队列先进先出&#xff0c;栈先进后出。 2、对插入和删除操作的"限定"不同。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。 3、遍历数据速度不同。 栈只能从头部取数据&…

栈和队列详解(C语言)

栈和队列 栈队列力扣笔试题 栈 栈是什么&#xff0c;栈是一种数据存储的结构&#xff0c;采用的是先进后出&#xff0c;后进先出的原则&#xff0c;就好像是弹匣里的子弹&#xff0c;比如说一个弹匣有30发容量&#xff0c;那第一个发压进去的子弹肯定是最后一个射出的&#xf…

栈和队列定义与特点

栈和队列定义与特点 1、栈&#xff08;stack&#xff09;1.1 栈的定义和特点1.2 栈的应用 2、队列(queue)2.1 队列的特点2.2 队列的应用 1、栈&#xff08;stack&#xff09; 1.1 栈的定义和特点 栈是仅在表尾进行插入、删除操作的线性表&#xff08;最后插入的会被最先删除&…

栈和队列的详解

目录 1. 栈的基本概念 1.1 栈的定义 1.2 栈的存储结构 1.3 栈的数学性质 2. 栈的基本操作 2.1 顺序栈定义 2.2 链式栈结点定义 3 栈输入输出的合理性 4 栈的全部输出结果 5 栈的相关应用 5.1 括号匹配 5.2 进制转化 6 队列的基本概念 6.1 队列的定义 6.2 队列…

【使用两个栈实现队列】

文章目录 一、栈和队列的基本特点二、基本接口函数的实现1.栈的接口2.创建队列骨架3.入队操作4.取出队列元素5.返回队首元素6.判断队列是否为空7.销毁队列 总结 一、栈和队列的基本特点 栈的特点是后进先出&#xff0c;而队列的特点是先进先出。 使用两个栈实现队列&#xff0…

【栈和队列】java实现栈和队列以及集合中的栈和队列

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f3cd;&#x1f3cd;&#x1f3cd;&#xff0c;今天我带领大家去学习栈和队列的相关知识&#xff0c;&#x1f49e;&#x1f49e;&#x1f49e;栈和队列在数据结构中是相对简单的&#xff0c;但是应用还是蛮多的&#xff…

数据结构——栈和队列

目录 一、栈 1.栈的概念及结构栈 2.栈的实现 二、队列 1.队列的概念及结构队列 2.队列的实现 一、栈 1.栈的概念及结构栈 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。不同于我们所说的栈区&#xff0c;栈是一种数据结构&#xff0c;栈区…

C语言栈和队列的实现

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转数据结构 &#x1f4ac;推荐…

栈和队列讲解

目录 1、栈 &#xff08;1&#xff09;栈的概念及结构 &#xff08;2&#xff09;栈的实现 2、队列 &#xff08;1&#xff09;队列的概念及结构 &#xff08;2&#xff09;队列的实现 前言&#xff1a;栈和队列是在顺序表和链表的延伸&#xff0c;如果前面的顺序表和链…

栈和队列(C++)

栈的相关概念 栈是仅在表尾进行插入&#xff0c;删除操作的线性表 表尾称为栈顶Top&#xff0c;表头称为栈底Base 插入元素到栈顶&#xff0c;称为入栈&#xff1b;从栈顶删除最后一个元素&#xff0c;称为出栈 栈的运算规则&#xff1a;先进后出 一.顺序栈 顺序栈的表示 …

栈和队列的基本操作(栈和队列的区别)

数据结构中的栈与内存中的栈的不同 一、数据结构中的堆栈 在数据结构中的堆栈&#xff0c;实际上堆栈是两种数据结构&#xff1a;堆和栈。堆和栈都是一种数据项按序排列的数据结构。 1.栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧&#xff0c;它是一种具有后进先…

栈和队列——python

目录 一、栈 定义一个栈 栈的应用——括号匹配问题 栈的应用——迷宫问题 二、队列 自定义队列 python队列的内置模块 队列应用——打印文件后五行 队列应用——迷宫问题 python的数据结构与算法之栈与队列 自学视频&#xff1a;bilibili路飞学城清华大学博士讲解Pyt…

栈和队列的概念

文章目录 栈、队列和双端队列栈队列双端队列Java 中的栈、队列和双端队列 单调栈和单调队列二叉堆和优先队列二叉堆优先队列 目录 栈、队列和双端队列 栈和队列是常见的数据结构。栈的特点是后进先出&#xff0c;添加元素、删除元素和查看元素都在栈顶操作。队列的特点是先进先…