低版本系统兼容的ActionBar(一)设置颜色+添加Menu+添加ActionMode

之前我一直用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的更多相关文章
- 低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode
这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分 ...
- 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航
Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...
- 低版本系统兼容的ActionBar(五)修改ActionBar的全套样式,从未如此简单过
设定ActionBar的样式,是我们必须掌握的技能,在之前我们可能都需要一行一行的写代码,然后在模拟器上测试效果,但是现在我们有个一个很棒的工具来设定样式.设定ActionBar样式的工作从 ...
- 低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar
一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="u ...
- 低版本系统兼容的ActionBar(七)自定义Actionbar标题栏字体
这个自定义字体其实和ActionBar有关,但之前写AtionBar的时候没考虑到修改字体样式,今天看到一篇专门写这个的文章就贴上使用方式.╮(╯▽╰)╭,不得不说Actionbar的那个样式真是让人 ...
- 低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment
在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里 ...
- Android 高版本API方法在低版本系统上的兼容性处理
Android 版本更替,新的版本带来新的特性,新的方法. 新的方法带来许多便利,但无法在低版本系统上运行,如果兼容性处理不恰当,APP在低版本系统上,运行时将会crash. 本文以一个具体的例子说明 ...
- hyperscan在低版本系统应用问题
编译环境:centos6.3 32位/64位 由于hyperscan使用许多C++11特性,在低版本系统gcc版本不能编译.后来发现在runtime时也就是hs_scan时只需要依赖libhs_run ...
- 低版本Flume兼容高版本elasticsearch
Flume更新比较慢,而elasticsearch更新非常快所以当涉及更换elasticsearch版本时会出现不兼容问题. apache-flume-1.6.0+elasticsearch1.5.1 ...
随机推荐
- Ubuntu 下 vi 输入方向键会变成 ABCD 的解决方法
Ubuntu 下 vi 输入方向键会变成 ABCD,这是 Ubuntu 预装的是 vim tiny 版本,安装 vim full 版本即可解决. 先卸载vim-tiny: $ sudo apt-get ...
- 微信隐藏的webJS Api汇总
1.右侧菜单增加"查看公众账号" API document.getElementById('post-user').addEventListener('click', functi ...
- sql 多表查询结果验证
1.笛卡尔积 定义: 设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成的有序对,所有这样的有序对组成的集合 ,叫做A与B的笛卡尔积,记作AxB. 上面有一个很关键的词为“有序”,因此,我们 ...
- 001.Rsync简介及使用
一 基础知识 1.1 简介 Rsync是Linux系统中的数据镜像备份工具,通过rsync可以将本地系统数据通过网络备份到任何远程主机上.rysnc不仅仅能对不同位置的文件和目录进行同步,还可以差异计 ...
- Git 版本控制管理(二)
Git 分支管理 1. 概念 我们来抽象的理解,分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN.如果两个平行宇宙互不干扰,那对现在的你也 ...
- JSP中的Java代码和内置对象
一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...
- Jmeter脚本录制方法(一)分别使用Badboy录制和Jmeter自带的代理服务器录制
Jmeter录制方式分三种,分别是:使用Badboy录制.Jmeter自带的代理服务器录制和手工录制,今天先介绍前两种录制方法. Badboy录制 Badboy是用C++开发的动态应用测试工具, 其拥 ...
- LruCacahe在美团DSP系统中的应用演进
背景 DSP系统是互联网广告需求方平台,用于承接媒体流量,投放广告.业务特点是并发度高,平均响应低(百毫秒). 为了能够有效提高DSP系统的性能,美团平台引入了一种带有清退机制的缓存结构LruCach ...
- 洛谷 P1135 奇怪的电梯
题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开 ...
- [转]eclipse转idea, 快捷键设置
原文地址: eclipse转idea, 快捷键设置 设置快捷键的途径: 打开idea的配置,找到Keymap,设置为eclipse 另外还要手动设置某些快捷键 上下移动 点击类打开 代码提示 查询 ...