之前我一直用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. explain的使用

    MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. mysql. row ************ ...

  2. sed正则表达式匹配,各种括号的转义和不转义

    https://blog.csdn.net/zl87758539/article/details/77481679

  3. linux操作系统语言更改

    有时候我们的服务器在安装时安装的默认语言不支持中文,导致程序.文档中的汉子显示乱码,从而使系统报一些莫名其妙的错误,这是可以更改操作系统的默认语言 1.echo  $LANG   查看当前操作系统的语 ...

  4. Centos下命令行编译MapReduce代码(Java)并打包在Hadoop中执行

    前提条件:搭建好Hadoop系统 新建文件夹:input  和  output hdfs dfs -mkdir /inputhdfs dfs -mkdir /output 查看文件系统 hdfs df ...

  5. 反射调用 java bean的set和get方法

    一.使用java.beans.PropertyDescriptor import java.beans.IntrospectionException; import java.beans.Proper ...

  6. QT学习笔记9:QTableWidget的用法总结

    最近用QT中表格用的比较多,使用的是QTableWidget这个控件,总结一下QTableWidget的一些相关函数. 1.将表格变为禁止编辑: tableWidget->setEditTrig ...

  7. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  8. 9、Redis处理过期keys的机制

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 1.Redis处理过期k ...

  9. 针对MyISAM锁表的解决方案

    最近服务器上经常出现mysql进程占CPU100%的情况,使用show processlist命令后,看到出现了很多状态为LOCKED的sql.使用show status like 'table%'检 ...

  10. slf4j 和 log4j合用的(Maven)配置

    简述: 添加logger的日志输出,下面是配置信息供备忘   步骤: 1. 在Maven的porn.xml 文件中添加dependency如下 <dependency> <group ...