之前我一直用ActionBarSherlock这个开源项目来做ActionBar,因为它可以让低版本的设备也能用上ActionBar。但是在最新的SDK中Google提供了一个AppCompat的工程作为libary。它里面就提供了向低版本兼容的ActionBar,所以我们就直接用官方的库就行了。这里需要注意的是,如果你是用最新的Eclipse with SDK自动创建的工程,那么就没有问题,如果是自己建立的工程,那么就需要设置style文件和添加一些命名空间,具体步骤请参照:http://blog.csdn.net/xyz_lmn/article/details/12623609。所以这里还是推荐大家去升级最新的SDK和ADT,我是用Eclipse来编写的。其他的编译器,如android studio,可能有不同的方式。

新版本中的一些注意事项请参照官方文档中的说明(懒得翻墙,这是国内转载过来的):

http://www.tuicool.com/articles/ZnmqYr

一、一些常规的设置

       actionBar = getSupportActionBar();//初始化ActionBar
actionBar.setDisplayHomeAsUpEnabled(true);//显示左边的小箭头
actionBar.setDisplayShowHomeEnabled(true);//显示home图片
setTitle("标题");//设置标题 actionBar.setIcon(getResources().getDrawable(R.drawable.ic_launcher));//设置左边的图标
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.bar_color));//设置背景图

如果想在xml文件中设置左边的小图标,或者是title文字,那么给activity定义如下属性即可

<activity
android:name="com.example.actionbartest.MainActivity"
android:label="天气"
android:logo="@drawable/weather" >
</activity>

label就是title,logo就是ico

显示和隐藏

     case R.id.hide_button_id:
actionBar.hide();
break;
case R.id.show_button_id:
actionBar.show();
break;

二、给ActionBar中添加MenuItem

1)从xml文件中静态添加

在res/menu下建立一个xml文件,我这里叫做main,添加如下代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.kale.actionbar.MainActivity" > <item
android:id="@+id/action_settings"
android:showAsAction="withText"
android:title="菜单"
app:showAsAction="always">
<!-- android:icon="@drawable/ic_launcher" -->
<!-- 如果菜单下面有group,建议菜单项是永远显示的。如果用never,就会出现二级菜单的别扭操作 -->
<menu> <!-- 定义菜单类型checkableBehavior:single(单选菜单)/all(多选)/none(普通) -->
<group android:checkableBehavior="none" >
<item
android:id="@+id/menu01_id"
android:icon="@drawable/ic_launcher"
android:title="选项01"/>
<item
android:id="@+id/menu02_id"
android:title="选项02"/>
</group>
</menu>
</item>
<!-- 一个最简单的菜单 -->
<item
android:icon="@drawable/ic_refresh"
android:showAsAction="withText"
android:title="simple"
app:showAsAction="always"/>
<!-- 自定义的视图菜单 -->
<item
android:id="@+id/clock_item_id"
android:showAsAction="withText"
android:title="clock"
app:actionLayout="@layout/clock"
app:showAsAction="always"/> </menu>

* 官方推荐每一个item项都要有icon和title图标,因为系统默认显示的是图标,
* 而且当屏幕空间不够的时候,未显示的菜单就会隐藏到列表中,而列表中只能显示title字段的值。

    <item
android:id="@+id/clock_item_id"
android:showAsAction="withText"
android:title="clock"
app:actionLayout="@layout/clock"
app:showAsAction="always"/>
这里需要特别注意的是,文件要有自己的命名空间。而且设置showAsAction或actionLayout时需要用自定义命名空间中的属性,否则无效!

然后我们在代码中使用回调函数和相应的监听器就能得到按钮的事件了

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
AnalogClock clock = (AnalogClock) MenuItemCompat.getActionView(menu.findItem(R.id.clock_item_id)); if (clock == null) {
System.out.println("------------------->null");
}
else {
System.out.println("-------------not null -----------");
}
if (FLAG == 1) {
createMenu(menu);
}
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.home:
break;
case R.id.homeAsUp:
break; default:
break; }
Toast.makeText(getApplicationContext(), item.getTitle(), 0).show();
return super.onOptionsItemSelected(item);

2)用代码添加菜单

除了用xml文件添加菜单外,我们还可以在代码中对菜单进行添加:

  private void createMenu(Menu menu) {
// add (int groupId, int itemId, int order, int titleRes)
MenuItem item01 = menu.add(0, 01, 0, "No 1");
MenuItemCompat.setShowAsAction(item01, MenuItemCompat.SHOW_AS_ACTION_NEVER); MenuItem item02 = menu.add(0, 02, 0, "No 2");
MenuItemCompat.setShowAsAction(item02, MenuItemCompat.SHOW_AS_ACTION_NEVER);
}

然后在方法中初始化即可

@Override
public boolean onCreateOptionsMenu(Menu menu) {
createMenu(menu);
return true;
}

三、添加ActionMode菜单

Android 3.0以前,我们处理列表的长按事件经常使用Context Menu,Android3.0以后,我们有了新的选择:ActionMode。下图左边效果为Context Menu右边效果为ActionMode。

但对于长按出现菜单这个事件,我还是推荐用Context Menu来做,因为现在手机屏幕越来越大,点击上方或者下方都是很别扭的事情,中间的弹出菜单式比较好的选择。

图片来自:http://xyzlmn.blog.51cto.com/2532390/1344872

使用ActionMode需要3步:

  1、实现ActionMode.Callback接口

  2、处理ActionMode的生命周期

  3、调用startSupportActionMode(Callback callback)方法

1、建立类,继承接口。2、在里面处理初始化的内容和点击事件

    /**
* @author:Jack Tony
* @tips :处理ActionMode的生命周期事件
* 感谢:http://xyzlmn.blog.51cto.com/2532390/1344872
* @date :2014-7-27
*/
private class ActCallback implements ActionMode.Callback {
/*
* @see
* android.support.v7.view.ActionMode.Callback#onCreateActionMode(android
* .support.v7.view.ActionMode, android.view.Menu) 第一次初始化的时候调用
*/
@Override
public boolean onCreateActionMode(ActionMode arg0, Menu menu) {
MenuItem saveItem = menu.add("save").setIcon(R.drawable.ic_compose);
MenuItemCompat.setShowAsAction(saveItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItem searchItem = menu.add("Search").setIcon(R.drawable.ic_search);
MenuItemCompat.setShowAsAction(searchItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItem refreshItem = menu.add("Refresh").setIcon(R.drawable.ic_refresh);
MenuItemCompat.setShowAsAction(refreshItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
} /*
* @see
* android.support.v7.view.ActionMode.Callback#onPrepareActionMode(android
* .support.v7.view.ActionMode, android.view.Menu) 在初始化后和每次重新构建的时候调用
*/
@Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
return false;
} /*
* @see
* android.support.v7.view.ActionMode.Callback#onActionItemClicked(android
* .support.v7.view.ActionMode, android.view.MenuItem) 但控件被点击的时候调用
*/
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Toast.makeText(MainActivity.this, "Got click: " + item.getTitle(), Toast.LENGTH_SHORT).show();
mode.finish();
return false;
} /*
* @see
* android.support.v7.view.ActionMode.Callback#onDestroyActionMode(android
* .support.v7.view.ActionMode) 当mode被关闭的时候调用
*/
@Override
public void onDestroyActionMode(ActionMode arg0) { } }

3、在按钮上调用方法 (补充:ActionMode mMode;)

    case R.id.openMode_button_id:

             mMode = startSupportActionMode(new ActCallback());
mMode.setTitle("Mode Title");
break;
case R.id.closeMode_button_id:
if (mMode != null) {
mMode.finish();
}
break;

完整Java代码:

package com.kale.actionbar;

import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AnalogClock;
import android.widget.Toast; public class MainActivity extends ActionBarActivity { ActionBar actionBar;
ActionMode mMode;
static int FLAG = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); actionBar = getSupportActionBar();//初始化ActionBar
actionBar.setDisplayHomeAsUpEnabled(true);//显示左边的小箭头
actionBar.setDisplayShowHomeEnabled(true);//显示home图片
setTitle("标题");//设置标题 actionBar.setIcon(getResources().getDrawable(R.drawable.ic_launcher));//设置左边的图标
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.bar_color));//设置背景图 } private void createMenu(Menu menu) {
// add (int groupId, int itemId, int order, int titleRes)
MenuItem item01 = menu.add(0, 01, 0, "No 1");
MenuItemCompat.setShowAsAction(item01, MenuItemCompat.SHOW_AS_ACTION_NEVER); MenuItem item02 = menu.add(0, 02, 0, "No 2");
MenuItemCompat.setShowAsAction(item02, MenuItemCompat.SHOW_AS_ACTION_NEVER);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
AnalogClock clock = (AnalogClock) MenuItemCompat.getActionView(menu.findItem(R.id.clock_item_id)); if (clock == null) {
System.out.println("------------------->null");
}
else {
System.out.println("-------------not null -----------");
}
if (FLAG == 1) {
createMenu(menu);
}
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.home:
break;
case R.id.homeAsUp:
break; default:
break; }
Toast.makeText(getApplicationContext(), item.getTitle(), 0).show();
return super.onOptionsItemSelected(item);
} public void buttonListener(View v) {
switch (v.getId()) {
case R.id.hide_button_id:
actionBar.hide();
break;
case R.id.show_button_id:
actionBar.show();
break;
case R.id.addItem_button_id:
FLAG = 1;
supportInvalidateOptionsMenu();
break;
case R.id.deleteItem_button_id:
FLAG = 0;
supportInvalidateOptionsMenu();
break;
case R.id.openMode_button_id:
if (mMode == null) {
mMode = startSupportActionMode(new ActCallback());
mMode.setTitle("Mode Title");
}
break;
case R.id.closeMode_button_id:
if (mMode != null) {
mMode.finish();
mMode = null;
}
break;
default:
break;
}
} /**
* @author:Jack Tony
* @tips :处理ActionMode的生命周期事件
* 感谢:http://xyzlmn.blog.51cto.com/2532390/1344872
* @date :2014-7-27
*/
private class ActCallback implements ActionMode.Callback {
/*
* @see
* android.support.v7.view.ActionMode.Callback#onCreateActionMode(android
* .support.v7.view.ActionMode, android.view.Menu) 第一次初始化的时候调用
*/
@Override
public boolean onCreateActionMode(ActionMode arg0, Menu menu) {
MenuItem saveItem = menu.add("save").setIcon(R.drawable.ic_compose);
MenuItemCompat.setShowAsAction(saveItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItem searchItem = menu.add("Search").setIcon(R.drawable.ic_search);
MenuItemCompat.setShowAsAction(searchItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItem refreshItem = menu.add("Refresh").setIcon(R.drawable.ic_refresh);
MenuItemCompat.setShowAsAction(refreshItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
} /*
* @see
* android.support.v7.view.ActionMode.Callback#onPrepareActionMode(android
* .support.v7.view.ActionMode, android.view.Menu) 在初始化后和每次重新构建的时候调用
*/
@Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
return false;
} /*
* @see
* android.support.v7.view.ActionMode.Callback#onActionItemClicked(android
* .support.v7.view.ActionMode, android.view.MenuItem) 但控件被点击的时候调用
*/
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Toast.makeText(MainActivity.this, "Got click: " + item.getTitle(), Toast.LENGTH_SHORT).show();
mode.finish();
return false;
} /*
* @see
* android.support.v7.view.ActionMode.Callback#onDestroyActionMode(android
* .support.v7.view.ActionMode) 当mode被关闭的时候调用
*/
@Override
public void onDestroyActionMode(ActionMode arg0) { } }
}

源码下载:http://download.csdn.net/detail/shark0017/7686649

低版本系统兼容的ActionBar(一)设置颜色+添加Menu+添加ActionMode的更多相关文章

  1. 低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

           这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分 ...

  2. 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航

    Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...

  3. 低版本系统兼容的ActionBar(五)修改ActionBar的全套样式,从未如此简单过

         设定ActionBar的样式,是我们必须掌握的技能,在之前我们可能都需要一行一行的写代码,然后在模拟器上测试效果,但是现在我们有个一个很棒的工具来设定样式.设定ActionBar样式的工作从 ...

  4. 低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar

           一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="u ...

  5. 低版本系统兼容的ActionBar(七)自定义Actionbar标题栏字体

    这个自定义字体其实和ActionBar有关,但之前写AtionBar的时候没考虑到修改字体样式,今天看到一篇专门写这个的文章就贴上使用方式.╮(╯▽╰)╭,不得不说Actionbar的那个样式真是让人 ...

  6. 低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment

    在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里 ...

  7. Android 高版本API方法在低版本系统上的兼容性处理

    Android 版本更替,新的版本带来新的特性,新的方法. 新的方法带来许多便利,但无法在低版本系统上运行,如果兼容性处理不恰当,APP在低版本系统上,运行时将会crash. 本文以一个具体的例子说明 ...

  8. hyperscan在低版本系统应用问题

    编译环境:centos6.3 32位/64位 由于hyperscan使用许多C++11特性,在低版本系统gcc版本不能编译.后来发现在runtime时也就是hs_scan时只需要依赖libhs_run ...

  9. 低版本Flume兼容高版本elasticsearch

    Flume更新比较慢,而elasticsearch更新非常快所以当涉及更换elasticsearch版本时会出现不兼容问题. apache-flume-1.6.0+elasticsearch1.5.1 ...

随机推荐

  1. 如何区分prometheus中Histogram和Summary类型的metrics?

    要理解它们的区别,关键还是告业务应用. 但如何在学习时,如何区分呢? 有以下几个维度: histogram有bucket,summary在quatile. summary分位数是客户端计算上报,his ...

  2. 【Codechef】BB-Billboards

    题解 传说中的--半标准杨表(行单调不增,列单调减) 如果N能整除M,我们把序列分成\(\frac{N}{M}\)段 然后里面要填K个1,显然我每一段必须填K个1,且可以构造出合法的序列,所以最少要填 ...

  3. 【Java】 归并排序的非递归实现

    归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路 ...

  4. 027 Spark的优化总结

    1.四个部分

  5. cygwin安装sshd服务并实现无密码登录

    http://blog.csdn.net/cybercode/article/details/7080743 这篇文章主要是为我在win7(64位)下搭建hadoop环境所准备的.首先参照在cygwi ...

  6. 大数据小视角4:小议Lambda 与 Kappa 架构,不可变数据的计算探索

    这个系列文章之前因为私事荒废了很久,继续更新--之前与老大谈论架构时,老大和我聊了聊分布式数据处理之中的Lambda结构,之前在<Designing Data-Intensive Applica ...

  7. HTML5本地存储localStorage、sessionStorage及IE专属UserData

    By:王美建 from:http://www.cnblogs.com/wangmeijian/p/4518606.html 转载请保留署名和出处! 在客户端存储数据用的最普遍的方式非cookie莫属, ...

  8. Android - Base64

    Android 将图片转换为Base64 public void convertToBase64(View view) throws IOException { //获取ImageView的图片 Bi ...

  9. android 多线程的实现方式

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha. 1,通过创建线程池,来创建多个线程. 2,通过异步任务,来创建线程池,从而创建多线程. ...

  10. BZOJ.3139.[HNOI2013]比赛(搜索 Hash)

    题目链接 不会搜索了.. DFS()中两个参数,枚举每两个队伍的比赛结果(分配当前队伍的分数). 可以发现方案数量与具体哪只球队得了多少分无关,只与当前比赛的队伍数量和得分序列的组成有关.可以记忆化搜 ...