当前位置: 首页 > 编程日记 > 正文

【Android】ActionBar的使用(1)

前(fei)言(hua):转行iOS开发半年,很久没接触Android了,前几天去上课,听着实在无聊,随手拿了同学的一本《Android UI设计》,发现有好多基础知识自己虽然用过,但是都是当初做Android开发时,当项目需要的用到的时候才去百度,control+c和control+v后,便草草完事,以至于有时再需要使用某个控件或者功能时,再去百度或者翻查以前的代码。虽然曾经做了2年Android开发,但只是做了几个很水的app,为了不亏欠那两年奋斗的青春,现在开始,我将写一些关于Android基础的blog,祭奠下学Android的两年青春。废话不多说,这是这个系列第一篇《ActionBar的使用(1)》


1.什么是ActionBar?

Android的action bar是一个window 特性,能显示用户现在所处app的哪个页面(显示页面标题)、提供动作按钮(搜索、新增等)和导航(返回),和iOS的UINavigationBar作用一样。直接上官方图:


这是一个ActionBar例子,包含 [1] app icon, [2] 两个action items, 和 [3] action overflow.


ActionBar从 Android 3.0 (API level 11) 开始提供,如果我们新建的项目仅支持Android 3.0及以上,我们可以直接使用框架中的ActionBar API。如果要在 Android 2.1 (API level 7)及以上版本中使用,可以通过添加android-support-v4.jar后使用。上面提到的两种情况下,大多数API是一样的,只是包名不同:

API11以上

import android.app.ActionBar

API11以下

import android.support.v7.app.ActionBar

考虑到现在的Android手机版本都在4.0以及上,本文主要使用android.app.ActionBar。


新建项目时,只要 targetSdkVersion 或者 minSdkVersion设置为“11”或以上 ,Activity默认使用主题为 Theme.Holo,都带有ActionBar了,如果不需要使用ActionBar,可以将主题设为Theme.Holo.NoActionBar。



1.获取、隐藏和显示ActionBar

ActionBar actionBar = getActionBar();//获取ActionBar

actionBar.hide();//隐藏ActionBar

当actionBar被隐藏后,系统会自动调节布局来适配屏幕空间,可以调用show()来让actionBar重新显示。

*使用android-support-v4时,将getActionBar()改为getSupportActionBar()


2.添加Action Items

当我们的activity start,系统会调用activity的onCreateOptionsMenu()方法来创建action items,使用这个方法来加载定义了action items的菜单资源,例如,要添加两个action items,在res目录下新建一个文件夹,命名为menu,并新建一个xml文件,命名为main_activity_actions.xml, 添加以下代码,这段代码定义了两个action items:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/action_search"android:icon="@drawable/ic_action_search"android:title="@string/action_search"/><item android:id="@+id/action_compose"android:icon="@drawable/ic_action_compose"android:title="@string/action_compose" />
</menu>


在activity的onCreateOptionsMenu()方法中,加载上面的布局

@Override
public boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu items for use in the action barMenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.main_activity_actions, menu);return super.onCreateOptionsMenu(menu);
}

运行后效果如下:




但是我们的需求是action item直接显示在actionBar上,而不是在action overflow中,因此需要在每个<item>中,添加showAsAction=“ifRoom”,那么只要空间足够,每个action item都将单独显示(不建议使用always),例如:

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:yourapp="http://schemas.android.com/apk/res-auto" ><item android:id="@+id/action_search"android:icon="@drawable/ic_action_search"android:title="@string/action_search"yourapp:showAsAction="ifRoom"  />...
</menu>

效果如下:




如果希望action item同时显示图片和文字,我们只要修改showAsAction的值:

showAsAction="ifRoom|withText"

3.处理action items的点击事件

当用户点击action时,系统会调用activity的 onOptionsItemSelected()方法,通过调用MenuItem的getItemId()方法,得到<item> 中id属性的值,就可以确定是哪个action被点击:

@Override
public boolean onOptionsItemSelected(MenuItem item) {// Handle presses on the action bar itemsswitch (item.getItemId()) {case R.id.action_search:openSearch();return true;case R.id.action_compose:composeMessage();return true;default:return super.onOptionsItemSelected(item);}
}private void openSearch(){System.out.println("action_search被点击了");}private void composeMessage(){System.out.println("action_compose被点击了");}

如果是使用fragment来inflate菜单,当用户单击action item时,系统会通过Fragment类的onCreateOptionsMenu()的回调,来调用 onOptionsItemSelected()方法。但是,activity会先处理点击事件,所以在activity的onOptionsItemSelected()中,要返回ture,activity中的fragments才有机会执行fragment的onCreateOptionsMenu()方法。


4.使用分隔的action bar

先上官方效果图:


分隔的actionBar可以将action item置于屏幕底部。如何实现呢?

1.如果API是14及以上,只需要在每个<activity><application>中添加 android:uiOptions=“splitActionBarWhenNarrow" 

2.如果API是14以下,需要在每个 <activity>中添加 <meta-data>,如下:


<manifest ...><activity uiOptions="splitActionBarWhenNarrow" ... ><meta-data android:name="android.support.UI_OPTIONS"android:value="splitActionBarWhenNarrow" /></activity>
</manifest>

如果要实现图3中隐藏icon和title的效果,还需在activity中添加下面两行代码:

actionBar.setDisplayShowHomeEnabled(false) ;
actionBar.setDisplayShowTitleEnabled(false);

5.使用ActionBar上的icon来导航

可以将actionBar上的icon图标来作为返回按钮,就像iOS中的导航栏中的leftBarButtonItem,例如屏幕A显示一个列表,选择类表中的一项时,跳转到屏幕B,屏幕B可以包含返回按钮,来返回到屏幕A。

调用ActionBar实例的setDisplayHomeAsUpEnabled()方法即可显示actionBar的返回按钮(如下面代码)。现在可以看见了返回图标了。

actionBar.setDisplayHomeAsUpEnabled(true);

但是默认按了之后并没有任何效果。因此还需要使用下面两种方法的任何一种进行配置:

方法一。在manifest文件中声明上级activity

如果上级Activity是固定的,只需在manifest中声明,用户按了返回按钮后,actionBar就会自动跳回对应的activity,在Android 4.1 (API level 16)开始,可以在<activity>中直接设置parentActivityName属性来设置父activity,而在之前的版本中,添加一个<meta-data>元素来设置父activity:


<application ... >...<!-- The main/home activity (has no parent activity) --><activityandroid:name="com.example.myfirstapp.MainActivity" ...>...</activity><!-- A child of the main activity --><activityandroid:name="com.example.myfirstapp.DisplayMessageActivity"android:label="@string/title_activity_display_message"android:parentActivityName="com.example.myfirstapp.MainActivity" ><!-- Parent activity meta-data to support API level 7+ --><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value="com.example.myfirstapp.MainActivity" /></activity>
</application>

方法二。通过在Activity中overridegetSupportParentActivityIntent()和onCreateSupportNavigateUpTaskStack() 方法

这个方法适用于用户可能是通过不同的activity跳转到目前这个activity的情况,本文不做详细介绍,可以看官方文档:http://developer.android.com/training/implementing-navigation/ancestral.html



6.添加Action View

有时,简单的button并不能满足我们的需求,为了实现更多功能,我们还可以用action view.  action view是显示在actionBar 上作为相当于action button的wedget,例如,如果需要搜索功能,可以添加一个嵌入了SearchView widget的action view到actionBar中。如图所示是一个包含可折叠搜索栏的actionBar。



要声明一个action view,分别使用actionLayoutactionViewClass 属性来说明需要使用的layout或者widget,例如,下面代码添加了SearchView widget:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/action_search"android:icon="@drawable/ic_action_search"android:title="@string/action_search"android:showAsAction="ifRoom| collapseActionView"android:actionViewClass="android.widget.SearchView" /></menu>

如果要配置action view(例如添加监听器),可以在onCreateOptionsMenu()中通过menu.findItem(R.id.action_search).getActionView()来获取,例如:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu items for use in the action barMenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.main_activity_actions, menu);SearchView searchItem = (SearchView) menu.findItem(R.id.action_search).getActionView();//进行SearchView的设置,例如设置监听器等...return super.onCreateOptionsMenu(menu);}

其中关于SearchView控件的使用不在本文范围,可以参考官方文档:http://developer.android.com/guide/topics/search/search-dialog.html


由于篇幅关系,《ActionBar的使用(1)》先讲到这里,下一篇《ActionBar的使用(2)》将继续介绍ActionBar的其它用法(Action Provider、Navigation Tabs、Drop-down Navigation等),希望大家继续关注,我将尽快更新。



相关文章:

装饰器及例题分析

知识点&#xff1a; 装饰器的定义&#xff1a; - 装饰器的实现是函数里面嵌套函数; - 装饰器的本质是一个函数&#xff0c; 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能; - 装饰器需要传递一个函数&#xff0c; 返回值也是一个函数对象. 1、map函数 def …

iOS开发系列--让你的应用“动”起来

概览 在iOS中随处都可以看到绚丽的动画效果&#xff0c;实现这些动画的过程并不复杂&#xff0c;今天将带大家一窥iOS动画全貌。在这里你可以看到iOS中如何使用图层精简非交互式绘图&#xff0c;如何通过核心动画创建基础动画、关键帧动画、动画组、转场动画&#xff0c;如何通…

ios app 砸壳

这里介绍使用dumpdecrypted砸壳。原理是用DYLD_INSERT_LIBRARIES这个环境变量加载脱壳的动态链接库dumpdecrypted.dylib 1.ssh连接上越狱的机器&#xff0c;输入密码alpine ssh root192.168.7.116 2.打开要砸的app&#xff0c;ps aux | grep var找到它的目录 yigewangde-iPhone…

基于visual Studio2013解决面试题之0804复杂链表

&#xfeff;&#xfeff;&#xfeff;题目解决代码及点评/*复杂链表的拷贝&#xff0c;现在有一个复杂链表&#xff0c;完成一个clone函数拷贝一个链表复杂链表是指struct Node{struct Node* _next;struct Node* _sibling; // sibling指向链表中任意一个节点&#xff0c;或者…

python考试编程题

3. a: while True: s raw_input(变量名为:) if s exit: print 退出 break #判断是否由字母或下划线组成 if s[0].isalpha() or s[0] _: for i in s[1:]: if not (i.isalnum() or i _): print %s变量…

【分享】bootstrap学习笔记

一、基础知识 1.整体架构以响应式设计为理念&#xff0c;css组件、js插件jquery、基础布局组件和12栅格系统搭建。1.1响应式设计&#xff1a;结合media query查询&#xff0c;适应更多设备&#xff0c;自动适应用户的设备环境&#xff0c;不必为每个终端做一个特定的版本。2.cs…

大三下学期总结

本学期的最后一门考试已经考完了&#xff0c;就相当于本学期要结束了&#xff0c;本学期结束了&#xff0c;就相当于大学的学习生活接近尾声了。感觉大三下开学也只在不久之前&#xff0c;但是真的要结束了&#xff0c;我觉得这学期实在是过得太充实了&#xff0c;一直是在追着…

通过 cygwin64 自己编译对应的 Tera Term cyglaunch.exe

步骤如下&#xff1a; 将 cygterm.tar.gz解压到任意目录&#xff0c;当然要cygwin容易操作。&#xff08;本例直接放到$HOME目录下&#xff0c;启动cygwin后的默认目录&#xff0c;如果之前没有更改的话&#xff09;将 Makefile 中的 -mno-cygwin 选项删除。执行make&#xff0…

面向对象概念及三大特点

面向对象&#xff1a; 面向对象的基本概念 面向对象 oop : object oriented programming 我们之前学习的编程方式就是面向过程的 面向过程和面向对象&#xff0c;是两种不同的编程方式 对比面向过程的特点&#xff0c;可以更好的了解什么是面向对象 过程和函数(都是对一段…

【Android】ViewPager实现无限循环滚动

最近做的一个项目&#xff0c;客户要求在ViewPager实现的主页面中滑动到最后一页后继续滑动能返回到第一页&#xff0c;也就是实现无限循环滚动&#xff0c;效果如下&#xff1a; 看了下ViewPager没有滑到尽头的回调方法&#xff0c;因此想到的解决方案是&#xff0c;在原来的最…

LabVIEW 三维机器人展示

本程序是使用solidworks绘制模型图,通过LabVIEW 2013导入wrl文件完成. 程序效果如下: (工程文件) (3维机器人模型) (控制界面,未做美化....因为实际上这部分程序只是一小部分,主程序运行时,这部分面板是不显示的~\(≧▽≦)/~啦啦啦) 程序下载: 百度网盘: http://pan.baidu.com/…

SqlServer2008查询性能优化_第一章

转载于:https://www.cnblogs.com/MiaoXin/p/5813207.html

Python之类

1、类的结构 1.使用面向对象开发&#xff0c;第一步是设计类 2.使用 类名() 创建对象&#xff0c;创建对象的动作有两步 1.在内存中为对象分配空间 2.调用初始化方法__init___ 为对象初始化 3.对象创建后&#xff0c;内存中就有了一个对象的实实在在的存在--实例 因此…

祝大家圣诞节快乐!

在圣诞节来临之际&#xff0c;分享这份网页的代码&#xff0c;祝愿大家圣诞节快乐&#xff01;点击这里查看效果 以下是源代码&#xff0c;可以保存到html文件打开看效果&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht…

【iOS官方文档翻译】UICollectionView与UICollectionViewFlowLayout

&#xff08;一&#xff09;先来简单回顾一下UICollectionView *UICollectionView的简单使用可以看我以前写的这篇博文&#xff1a;UICollectionView的基本使用 UICollectionView与UITableView很相似&#xff0c;必须实现两个代理&#xff1a;UICollectionViewDataSource和UI…

python之文件

1、什么是文件指针&#xff1f; 文件指针 文件指针标记从哪个位置开始读取数据 第一次打开文件时&#xff0c;通常文件指针会指向文件的开始位置 当执行了read方法后&#xff0c;文件指针会移动到读取内容的末尾 创建一个当前目录下的文件pass 内容为&#xff1a; westos …

一个6年的菜鸟,在4年之前做的一些功能(二)

前戏&#xff1a;针对上一篇列出来的功能点&#xff0c;今天和大家分享下这个自定义的公式是怎么设计的&#xff0c;由于我的第一篇博客在首页被管理员移走了&#xff0c;大家可以点击这里来跳转&#xff0c;看下第一篇的目录结构。本人作为老菜鸟&#xff0c;和大家分享的也是…

Oracle11.2新特性之listagg函数 (行列转换)

SELECT regexp_substr(公司1,贵公司2, [^,], 1, LEVEL, i) FROM dualCONNECT BY LEVEL < length(公司1,贵公司2) - length(REPLACE(公司1,贵公司2, ,, )) 1 以上为字符串带分隔符的转换为列 Oracle11.2新增了LISTAGG函数&#xff0c;可以用于字符串聚集&#xff0c;测试如下…

Mac 安装Android Studio

一、下载 可以通过以下这些网站下载Mac版的Android Studio http://www.androiddevtools.cn http://www.android-studio.org 二、安装 双击下载好的dmg文件&#xff0c;拖曳安装。 拷贝完成之后&#xff0c;在应用程序中打开Android Studio。这时候会引导进行环境安装和设置…

iscsi网络磁盘共享

iscsi(Internet SCSI)支持从客户端&#xff08;发起端&#xff09;通过IP向远程服务器上的ISCSI存储设备&#xff08;目标&#xff09;发送scsi命令。ISCSI限定名称用于确定发起端和目标&#xff0c;并采用iqn.yyy-mm.{reverse domain}:label的格式。 默认情况下&#xff0c;网…

转: IO设计模式:Reactor和Proactor对比

转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis、ACE&#xff0c;事件模型都使用的Reactor模式&#xff1b;而同样做事件处理的Proactor&#xff0c;由于操作系统的原因&#xff0c;相关的开源产品也少&#xff1b;这里学习下其模型结构&#xff…

程序员该怎样放松?8个好网站推荐

1&#xff09;看风景程序员每天在液晶屏幕下工作很长时间&#xff0c;应该让干涩的眼睛得到好好的放松&#xff0c;偶尔看看窗外的绿树或远处的风景可能是不错的方式&#xff0c;但是这在北京上海广州这样的大城市里不太现实&#xff0c;所以这里推荐一个纯粹的分享旅行照片的网…

【iOS】UIButton 图标在上文字在下

iOS默认的UIButton是图片在左文字在右&#xff0c;但是很多时候需求是图片在上文字在下&#xff08;如效果图1、效果图2&#xff09;&#xff0c;因此想到&#xff0c;通过写一个JXButton继承自UIButton&#xff0c;并重写相关方法即可&#xff0c;以后项目中需要用的话就直接使…

多线程和mysql

多线程 1、多线程的定义&#xff1a; 什么是线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位&#xff08;程序执行流的最小单元&#xff09;。它被包含在进程之中&#xff0c; 是进程中的实际运作单位。一个进程中可以并发多个线程&#xff0c;每条线程并行执行不…

poj2154-color-polyan次二面体+欧拉函数优化

N<1e9,O(nlogn)的做法会超时。从枚举置换转变为枚举轮换长度&#xff0c;然后可以利用欧拉函数&#xff0c;把复杂度变为O(√n * logn) 1 /*--------------------------------------------------------------------------------------*/2 3 #include <algorithm>4 #in…

【iOS】通讯录分组方式展示数据

本例子是将后台返回的医生列表&#xff08;包含姓名和电话&#xff0c;demo从plist文件读取&#xff09;&#xff0c;按拼音进行分组显示(A-Z)&#xff0c;最终效果如下图&#xff1a; 一、创建Doctor医生类: Doctor类属性包括姓名、电话以及姓名第一个字的拼音首字母&#xff…

LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)

client->VS->RS->client(VS只做调度,RS为虚拟服务器) LVS_DR原理图解&#xff1a; 优点&#xff1a;负载均衡器只负责将请求包分发给物理服务器&#xff0c;而物理服务器将应答包直接发给用户。所以&#xff0c;负载均衡器能处理 很巨大的请求量&#xff0c;这种方式…

【LeetCode】136. Single Number 解题小结

题目&#xff1a; Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 这题目的要求不仅是要求是线性时间…

iOS小技巧积累

平时项目中用到的&#xff0c;记录下来&#xff08;持续更新&#xff09;。1.在导航栏右边添加多个UIBarButtonItemUIBarButtonItem *searchScheduleBtn [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:"search_small"] style:UIBarButtonItemStylePl…

(转)iPhone开发经典语录集锦

1&#xff1a;如果无法保证子类行为的一致性&#xff0c;那么就用委托 If the subClass cannt keep with superClass,use delegate rather than inheritance. 2:屏幕上看到的&#xff0c;都是UIVew Everything you see on Screen is UIView. 3:如果对性能要求高&#xff0c;慎…