之前我一直用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,可能有不同的方式。
新版本中的一些注意事项请参照官方文档中的说明(懒得FQ,这是国内转载过来的):
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"> <menu> <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字段的值。
- 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