首页 > 代码库 > ActionBar之setting+Menu+ActionMode介绍
ActionBar之setting+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,可能有不同的方式。
一、一些常规的设置
actionBar = getActionBar();//初始化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));//设置背景图
显示和隐藏
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) menu.findItem(R.id.clock_item_id) .getActionView();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; } 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, "group 1"); item01.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); MenuItem item02 = menu.add(0, 02, 0, "group 2"); item02.setShowAsAction(MenuItem.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 android.support.v7.view.ActionMode.Callback { /* * (非 Javadoc) * * @see * android.support.v7.view.ActionMode.Callback#onCreateActionMode(android * .support.v7.view.ActionMode, android.view.Menu) 第一次初始化的时候调用 */ @Override public boolean onCreateActionMode(ActionMode arg0, Menu menu) { menu.add("Save").setIcon(R.drawable.ic_compose) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Search").setIcon(R.drawable.ic_search) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Refresh").setIcon(R.drawable.ic_refresh) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); return true; } /* * (非 Javadoc) * * @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; } /* * (非 Javadoc) * * @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, Toast.LENGTH_SHORT).show(); mode.finish(); return false; } /* * (非 Javadoc) * * @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;
源码下载:http://download.csdn.net/detail/shark0017/7683623