Actionbarsherlock Demo 浅析 :Action Modes
**AndroidManifest文件里面:
<activity android:label="@string/action_modes" android:name=".ActionModes"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/> </intent-filter> </activity>
**Activity中的代码:
/**
ActionMode类
表示用户界面的上下文模式。行动模式可用于
模式与内容的相互作用,并取代部分的正常用户界面,直到完成。
良好的动作模式包括选择模式、搜索、内容编辑等。
*/
ActionMode mMode; mMode = startActionMode(new AnActionModeOfEpicProportions()); //SherlockActivity源文件中的函数 public ActionMode startActionMode(ActionMode.Callback callback) { return getSherlock().startActionMode(callback); }
callback是ActionMode的内部接口,首先创建动作模式时调用。所提供的菜单将用于生成动作模式的动作按钮。
ActionMode.Callback callback ; //内部包含的接口 public interface Callback { /** * 首先创建动作模式时调用。所提供的菜单将用于生成动作模式的动作按钮。 * * @param mode 被创建的Actionmode * @param menu 用于填充操作按钮的菜单 * @return 如果动作模式需要被创建则返回真,否则应该被终止 */ public boolean onCreateActionMode(ActionMode mode, Menu menu); /** * 当动作模式无用的时候会被调用。 * * @param mode 准备中的Action mode * @param menu <span style="font-family: Arial, Helvetica, sans-serif;">用于填充操作按钮的菜单</span> * @return 如果menu或者Action mode被更新了则返回true,否则返回false。 */ public boolean onPrepareActionMode(ActionMode mode, Menu menu); /** * 当用户单击按钮的时候触发 * * @param mode 当前的ActionMode * @param item 被点击的控件 * @return true 如果回调事件被处理了则返回true,否则返回false */ public boolean onActionItemClicked(ActionMode mode, MenuItem item); /** * 当action mode消失或者销毁的时候会被调用。 * * @param mode The current ActionMode being destroyed */ public void onDestroyActionMode(ActionMode mode); } }
getSherlock返回一个ActionBarSherlock类。该类负责Actionbar动作设计模式。
protected final ActionBarSherlock getSherlock() { if (mSherlock == null) { mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); } return mSherlock;
ActionBarSherlock里的wrap方法:使用Actionbar的抽象方法来包装Activity。
@param 选项控制的旗帜
@return 返回与actionbar交互的实例
public static ActionBarSherlock wrap(Activity activity, int flags);
****如果有时候发现图标消失,很有可能是因为图标的颜色问题,使用了白色的主题之后又使用了白色的图标,会导致图标看不见。
自定义Action Mode
参考:http://www.cnblogs.com/JinyaoLi/p/3868719.html
大致的思路:
1、新建一个类实现 ActionMode.Callback 接口
2、在类的onCreateActionMode()方法中调用menuInflater类,加载自己的menu资源。
3、实现自己的syle,自己的style是依赖于Theme的style,所以在Activity上THeme选单中选用自己的Theme。
--------示例:
1、实现ActionMode.Callback接口
//用来标记ActionMode和做出相关设置 private ActionMode mActionMode; private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { // Called each time the action mode is shown. Always called after onCreateActionMode, but // may be called multiple times if the mode is invalidated. @Override public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) { // TODO Auto-generated method stub return false; } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode arg0) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "Action Mode Closed",Toast.LENGTH_SHORT).show(); mActionMode = null; } // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // TODO Auto-generated method stub MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.main_context_menu, menu); return true; } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) { // TODO Auto-generated method stub int id = arg1.getItemId(); return false; } };
2、加载menu资源可以使用menu.add,也可以自己在res文件夹下创建属于menu的xml文件。
3、应用自己定义的Theme主题
<style name="MyActionBarTheme" parent="@style/Theme.AppCompat.Light">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="android:actionModeCloseDrawable">@drawable/ic_launcher</item>
<item name="android:actionModeBackground">@color/yellow</item>
<!-- ActionMode右边的按钮是一个特殊的CloseButton,分割线与CloseButton的Style有关 -->
<!-- 删除ActionMode的Divider-->
<item name="android:actionModeCloseButtonStyle">@null</item>
</style>
<!-- 这是自己定义的Actionbar的主题-->
<style name="MyActionBar" parent="@style/Widget.AppCompat.ActionBar">
<item name="android:background">@color/green</item> </style>
4、运用自己的主题
<activity android:label="@string/activity_name" android:name=".SampleList" android:theme="@style/MyActionBarTheme"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity></span>
这样就可以依据自己喜欢的样式来设计Actionbar。参考:http://www.cnblogs.com/JinyaoLi/p/3868719.html