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

posted @ 2015-08-05 10:59  黑泡man  阅读(160)  评论(0编辑  收藏  举报