Android之ActionBar学习
关于那个问题:是关于如何生成如下图所示之ActionBar效果:

其实就在官网上就有答案,自己疏忽再加上资料繁多。寻了许久,经过指点。终于找到:
To enable split action bar, simply add uiOptions="splitActionBarWhenNarrow" to your <activity> or <application> manifest element.(http://developer.android.com/guide/topics/ui/actionbar.html)Using split action bar 标题下。
如果你想拥有上图的那种效果,Fragment(关于Fragment的内容,见上篇)在menuItem的下面显示,在manifest.xml文件里在<activity>或者<application>里加上uiOptions="splitActionBarWhenNarrow" 即可。
注:本人在4.0版本平板上不能达到此效果,在4.0手机上可以实现。在平板上,效果类似如下:
,如果fragment增多,不会分裂出现上图效果,而使用下拉列表来显示Fragment。
下面开始正题。
简介
ActionBar是一个显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项。
我们可以选择可见的操作菜单可见项,不可见项会以下拉列表的形式呈现出来。(见上图相机图标右侧,点击出现下拉列 表,显示没有直接显示出来的操作菜单可见项)
ActionBar为Fragment之间提供标签导航

添加ActionBar
不需要导入ActionBar,因为在android3.0或者以上版本中,ActionBar已经默认的包含在Activity中
在Android3.0的默认主题“holographic”中,已经创造了ActionBar
当android:minSdkVersion 或者 android:targetSdkVersion 属性被设置成11或者更高时,应用会被认为是Android3.0版本(默认含有ActionBar)
去除ActionBar
我们可以通过把主题设置为Theme.Holo.NoActionBar为一个Activity去除掉ActionBar。 <activity android:theme="@android:style/Theme.Holo.NoActionBar">
我们也可以通过在代码中调用show()或者hide()方法来相应的显示或者隐藏ActionBar
添加Action Item
每一个操作菜单的菜单项都可以成为ActionBar中的一个Action Item
参考代码如下:
ActionBarDemoActivity.java:
[java]
public class ActionBarDemoActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button showBt = (Button) findViewById(R.id.showBt);
showBt.setOnClickListener(new OnClickListener()
{
public void onClick(View view)
{
ActionBar actionBar = getActionBar();
actionBar.show();
}
});
}
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
MenuItem add = menu.add(0, 1, 0, "Save");
MenuItem open = menu.add(0, 2, 1, "Open");
MenuItem close = menu.add(0, 3, 2, "Close");
add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
open.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
close.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}
}
main.xml
[html]
< ?xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<Button
android:id="@+id/hideBt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hide The Action Bar" >
</Button>
<Button
android:id="@+id/showBt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show The Action Bar" >
</Button>
< /LinearLayout>
效果图如下:

添加活动项(Action Item)
当使用xml文件创建菜单(menu)时,可以标记这些菜单项作为想要实现的Action Item
代码如下:
ActionBarXMLActivity:
[java]
public class ActionBarXMLActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.optionsmenu, menu);
return true;
}
}
optionsmenu.xml:
[html]
< ?xml version="1.0" encoding="utf-8"?>
< menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/item1"
android:orderInCategory="1"
android:showAsAction="ifRoom|withText"
android:title="@string/save"/>
<item
android:id="@+id/item1"
android:orderInCategory="2"
android:showAsAction="ifRoom|withText"
android:title="@string/edit"/>
<item
android:id="@+id/item1"
android:orderInCategory="3"
android:showAsAction="ifRoom|withText"
android:title="@string/about"/>
<item
android:id="@+id/item1"
android:orderInCategory="4"
android:showAsAction="ifRoom|withText"
android:title="@string/help"/>
< /menu>
效果图:

菜单项过多溢出
当创建一个ActionBar拥有太多的Action item以至于没有足够的控件来显示会在屏幕的右上角出现一个溢出菜单项,可以通过它来访问溢出部分菜单。
代码示例:
其Activity代码如上(ActionBarXMLActivity)
溢出菜单xml
[html]
< ?xml version="1.0" encoding="utf-8"?>
< menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/item1"
android:orderInCategory="1"
android:showAsAction="ifRoom|withText"
android:title="@string/save"/>
<item
android:id="@+id/item2"
android:orderInCategory="2"
android:showAsAction="ifRoom|withText"
android:title="@string/edit"/>
<item
android:id="@+id/item3"
android:orderInCategory="3"
android:showAsAction="ifRoom|withText"
android:title="@string/about"/>
<item
android:id="@+id/item4"
android:orderInCategory="4"
android:showAsAction="ifRoom|withText"
android:title="@string/help"/>
<item
android:id="@+id/item5"
android:orderInCategory="5"
android:showAsAction="ifRoom|withText"
android:title="@string/file"/>
<item
android:id="@+id/item6"
android:orderInCategory="6"
android:showAsAction="ifRoom|withText"
android:title="@string/run"/>
<item
android:id="@+id/item7"
android:orderInCategory="7"
android:showAsAction="ifRoom|withText"
android:title="@string/source"/>
<item
android:id="@+id/item8"
android:orderInCategory="8"
android:showAsAction="ifRoom|withText"
android:title="@string/navigate"/>
<item
android:id="@+id/item9"
android:orderInCategory="9"
android:showAsAction="ifRoom|withText"
android:title="@string/search"/>
<item
android:id="@+id/item10"
android:orderInCategory="10"
android:showAsAction="ifRoom|withText"
android:title="@string/project"/>
<item
android:id="@+id/item11"
android:orderInCategory="11"
android:showAsAction="ifRoom|withText"
android:title="@string/refactor"/>
<item
android:id="@+id/item12"
android:orderInCategory="12"
android:showAsAction="ifRoom|withText"
android:title="@string/window"/>
<item
android:id="@+id/item13"
android:orderInCategory="13"
android:showAsAction="ifRoom|withText"
android:title="@string/help"/>
< /menu>
其效果图如下:

使用带字的Action Item
Action item 默认格式是如果菜单项含字和图标的话,只显示图标
如果想要显示字的效果,在xml里如下设置:android:showAsAction="ifRoom|withText"
或者在代码里调用setShowAsAction():setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
Action事件
ActionBar中一个菜单项(即Action item)的触发像以前版本中的活动菜单回调方法(onOptionsItemSelected())一样。
当用户选择一个Fragment的菜单项时,首先会调用Activity的onOptionsItemSelected()方法,如果该方法返回false,则调用Fragment实现的onOptionsItemSelected()方法。
应用图标
默认情况下,应用图标在ActionBar的左侧
当用户点击应用bar的时候,系统会调用你的Activity里面的onOptionsItemSelected() 方法里面的Android.R.id.Home ID(你的主ID)里定义的事件。我们可以重写这个方法,添加一个条件执行该行为:让它跳转到这个应用的主Activity而不是返回的主屏幕。
如果选择返回应用的主activity,最好的方式是在创建的Intent中添加FLAG_ACTIVITY_CLEAR_TOP这个标签。
使用这个FLAG_ACTIVITY_CLEAR_TOP标签,如果应用的主Activity已经在activity栈中存在,所有在其上的activity都会被销毁,然后主activity会到栈顶,而不用创建主Activity的的新实例。
[java]
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
当我们想实现用户点击ActionBar 图标后返回前一个activity,可以通过在Actionbar设置setDisplayHomeAsUpEnabled(true) 来实现。
[java]
public class HomyUpActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
super.onStart();
ActionBar actionBar = this.getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.optionsmenu, menu);
return true;
}
}
效果图:
添加活动视图
我们也可以添加一个视图作为一个Action Item.我们可以通过在xml元素的android:actionLayout属性制定我们希望现实布局资源的ID(例如@layout/mysearchview)
我们可以选择添加android:actionViewClass属性分配与完全限定的类名描述我们想要显示的视图(例如android.widget.SearchView)
代码示例:
optionsmenu.xml
[java]
< ?xml version="1.0" encoding="utf-8"?>
< menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/item4"
android:orderInCategory="4"
android:showAsAction="ifRoom|withText"
android:title="@string/help"/>
<item
android:id="@+id/item5"
android:orderInCategory="5"
android:showAsAction="ifRoom|withText"
android:title="@string/file"/>
<item
android:id="@+id/search"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="ifRoom"
android:title="Search"/>
< /menu>
HomeUpActivity.java
[java]
public class HomyUpActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
super.onStart();
ActionBar actionBar = this.getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.optionsmenu, menu);
return true;
}
}
效果图:

ActionBar 标签
ActionBar可以现实选项卡供用户切换浏览该Activity中不同的Fragment
每个标签都可以是一个图标或文本标题
代码示例:
TabsActivity.java
[java]
public class TabsActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab tabA = bar.newTab().setText("A Tab");
ActionBar.Tab tabB = bar.newTab().setText("B Tab");
ActionBar.Tab tabC = bar.newTab().setText("C Tab");
Fragment fragmentA = new AFragmentTab();
Fragment fragmentB = new BFragmentTab();
Fragment fragmentC = new CFragmentTab();
}
tabA.setTabListener(new MyTabsListener(fragmentA));
tabB.setTabListener(new MyTabsListener(fragmentB));
tabC.setTabListener(new MyTabsListener(fragmentC));
bar.addTab(tabA);
bar.addTab(tabB);
bar.addTab(tabC);
protected class MyTabsListener implements ActionBar.TabListener
{
private Fragment fragment;
public MyTabsListener(Fragment fragment)
{
this.fragment = fragment;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft)
{
ft.add(R.id.fragment_place, fragment, null);
}
}
}
AFragmentTab.java
[java]
public class AFragmentTab extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_a, container, false);
}
}
BFragmentTab.java
[java]
public class BFragmentTab extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_b, container, false);
}
}
CFragmentTab.java
[java]
public class CFragmentTab extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_c, container, false);
}
}
main.xml
[html]
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</LinearLayout>
< /LinearLayout>
效果图:
Android之ActionBar学习的更多相关文章
- Android中ActionBar及Overflow的显示
最近在按照Android的API文档学习Android中actionbar的使用,Action bar 最基本的形式,就是为 activity 显示标题,并且在标题左边显示一个 app icon.在这 ...
- android NDK 实用学习(五)-c++端调用java接口
1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...
- android NDK 实用学习(三)- java端类对象的构造及使用
1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...
- android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值
1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值 env->SetBooleanF ...
- Android源码学习之装饰模式应用
首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...
- Android应用开发学习之表格视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来学习一个使用表格视图的程序,下图是该程序的运行效果: 该程序主Activity文件内容如下: packag ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- Android 实现ActionBar定制
我们在使用Android手机时,经常发现应用中的ActionBar和我们平时使用的ActionBar相差非常大.简单的说就是,其他应用的 ActionBar为什么那么绚丽,自己应用的ActionBar ...
- Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面
感觉 Android 到处都是坑,每个地方都要把人折腾半天. 今天来简单说说 Android之ActionBar.Tabs.Fragment.ViewPager 实现标签页切换并缓存页面 关于他们的介 ...
随机推荐
- matlab---边缘之sobel简单实例
最近在项目中需要做一些图像边缘检测的工作,但是由于之前没接触过图像处理的相关知识,所以只得 在matlab里面对一些图像处理函数挨个挨个的试着用.在用的过程中在慢慢的明白了一些简单的图像处 理方法. ...
- 蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 蓝牙和无线有什么区别?
蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 转自知乎用户的一个回答: 原题问的是"数据流量是什么",不知道怎么又被改成"蜂窝移动网络是什么"了.说下个人 ...
- 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7 ...
- Oracle存储过程 使用游标、数组的配合查询
查询输入的门牌号码是否在标准门牌库中存在.存在则返回相应的号码. public string GetValidate(){ OracleConnection conn = ConnectOra(); ...
- T-SQL触发器
触发器 对表进行增删改操作时,自动执行的一个操作.当操作一个表的同时,需要进行其它关联操作的时候,就可以用到触发器. 比如:下订单时,创建中的商品数量需要减少 比如:退票时,总的票量要增加 属于DDL ...
- ThInkPHP中的常量
除了常规变量的输出外,模板引擎还支持系统变量和系统常量.以及系统特殊变量的输出.它们的输出不需要事先赋值给某个模板变量.系统变量的输出必须以$Think.打头,并且仍然可以支持使用函数.常用的系统变量 ...
- poj 2431
大意: 有n个加油点,给出每个加油点距离终点的位置和能加多少油,最后一行给出总长度和最初的油量.求最少加几次油能到终点,不能到的话输出-1. Sample Input 4 4 4 5 2 11 5 1 ...
- 工厂类分离与java反射机制
网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录 加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我 黙 ...
- eclipse 使用maven 创建springmvc + mybatis
接着eclipse 使用maven 创建纯spring mvc项目 毕竟项目都要访问数据库的, 所以加上mybatis的支持也就是网上大多时候说的 SSM框架的搭建(Spring + Spring M ...
- log4net自定义扩展及配置说明
log4net文件保存配置我就不说太多了,网上一大把的,数据库配置其实网上也有,只是我第一次按照网上的配置没有跑通,我就说下数据库配置需要注意的地方吧. 下面是一个log4net的数据库代码配置 pu ...