ActionBar与ActionMode初体验 

[复制链接]
   

18

主题

2

好友

819

积分

No.4 中级开发者

Rank: 4

升级  19.83%

精华
0
帖子
123
e币
590 元
跳转到指定楼层
楼主
 
 发表于 2012-11-13 19:52:12 |只看该作者 |倒序浏览
本帖最后由 antoon_nee 于 2012-11-13 19:51 编辑

ActionBar
1 ,先链接一篇csdn大牛翻译的文章  http://blog.csdn.net/xyz_lmn/article/details/8132420 ,调理一下理论知识。

2 ,再分享一个小实例 : http://www.cnblogs.com/hanyuan/archive/2012/04/11/Android_ActionBar_AddingDrop-downNavigation.html。
      在Gallery2源码中对ActionBar使用很多,来张Gallery2截图感受一下。
3 ,在4.0系统中可以设置菜单项属性android:showAsAction,菜单项放在Action Bar的右上角

    android:showAsAction值有:

    1、always:菜单项一直显示在Action Bar上。

    2、ifRoom:如果有足够的空间,菜单项显示在Action Bar上。

    3、never:菜单项永远不出现在Action Bar上。

    4、withText:菜单项和它的图标,title一起显示。

      来一张Gallery2截图2看看效果。
-------------------------------------------------------------------------------------
ActionMode
1,再链接一篇csdn大牛翻译的文章 http://blog.csdn.net/fireofstar/article/details/7350177。
2,使用ActionMode,它会临时占据action bar的位置,但与ActionBar是独立的。
         在上面ActionBar的实例基础上增加ActionMode效果。直接上代码(附件有完整代码,CustomMenu.java是直接从Gallery2源码中拿过来的):

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.example.actionbar_clustermenu;
 
import android.os.Bundle;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;
 
public class MainActivity extends Activity
{
        private ActionModeHandler mActionModeHandler;
        private static final int MENU_PREFERENCES = 31;
         
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // 生成一个SpinnerAdapter
        SpinnerAdapter adapter = ArrayAdapter.createFromResource(this, R.array.student, android.R.layout.simple_spinner_dropdown_item);
        // 得到ActionBar
        ActionBar actionBar = getActionBar();
        // 将ActionBar的操作模型设置为NAVIGATION_MODE_LIST
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        // 为ActionBar设置下拉菜单和监听器
        actionBar.setListNavigationCallbacks(adapter, new DropDownListenser());
         
        mActionModeHandler = new ActionModeHandler(this);
    }
 
    /**
     * 实现 ActionBar.OnNavigationListener接口
     */
    class DropDownListenser implements OnNavigationListener
    {
        // 得到和SpinnerAdapter里一致的字符数组
        String[] listNames = getResources().getStringArray(R.array.student);
 
        /* 当选择下拉菜单项的时候,将Activity中的内容置换为对应的Fragment */
        public boolean onNavigationItemSelected(int itemPosition, long itemId)
        {
             
            return true;
        }
    }
 
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
                super.onPrepareOptionsMenu(menu);
                menu.clear();
                menu.add(0, MENU_PREFERENCES, 0, R.string.action_mode).setIcon(
                android.R.drawable.ic_menu_preferences);
                return true;
        }
 
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                if(MENU_PREFERENCES == item.getItemId()){
                         mActionModeHandler.startActionMode();
                }
                return super.onOptionsItemSelected(item);
        }
     
     
     
     
}


代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.example.actionbar_clustermenu;
 
import android.app.Activity;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu.OnMenuItemClickListener;
import com.example.actionbar_clustermenu.CustomMenu.DropDownMenu;
 
public class ActionModeHandler implements ActionMode.Callback {
    private Activity  mActivity;
    private DropDownMenu mSelectionMenu;
    private boolean selectAllState = false;
 
    public ActionModeHandler(Activity activity) {
            mActivity = activity;
    }
 
    public ActionMode startActionMode() {
        final ActionMode actionMode = mActivity.startActionMode(this);
        View customView = LayoutInflater.from(mActivity).inflate(
                R.layout.action_mode, null);
        actionMode.setCustomView(customView);
        CustomMenu customMenu = new CustomMenu(mActivity);
        mSelectionMenu = customMenu.addDropDownMenu(
                (Button) customView.findViewById(R.id.selection_menu),
                R.menu.selection);
        updateSelectionMenu();
        customMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                return onActionItemClicked(actionMode, item);
            }
        });
        return actionMode;
    }
 
    public void setTitle(String title) {
        mSelectionMenu.setTitle(title);
    }
 
 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        if (item.getItemId() == R.id.action_select_all) {
            updateSelectionMenu();
        }
        return true;
    }
 
    private void updateSelectionMenu() {
        // update title
        setTitle("oh yeah");
        if(selectAllState){
                selectAllState = false;
        }else {
                selectAllState = true;
        }
        // For clients who call SelectionManager.selectAll() directly, we need to ensure the
        // menu status is consistent with selection manager.
        MenuItem item = mSelectionMenu.findItem(R.id.action_select_all);
        if (item != null) {
            if (selectAllState) {
                item.setChecked(true);
                item.setTitle(R.string.deselect_all);
            } else {
                item.setChecked(false);
                item.setTitle(R.string.select_all);
            }
        }
    }
 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.activity_main, menu);
        return true;
    }
 
    public void onDestroyActionMode(ActionMode mode) {
        //leave current UI to before activity
    }
 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return true;
    }
 
 
}


代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.example.actionbar_clustermenu;
 
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
 
import java.util.ArrayList;
 
public class CustomMenu implements OnMenuItemClickListener {
    @SuppressWarnings("unused")
    private static final String TAG = "FilterMenu";
 
    public static class DropDownMenu {
        private Button mButton;
        private PopupMenu mPopupMenu;
        private Menu mMenu;
 
        @SuppressWarnings("deprecation")
                public DropDownMenu(Context context, Button button, int menuId,
                OnMenuItemClickListener listener) {
            mButton = button;
            mButton.setBackgroundDrawable(context.getResources().getDrawable(
                    R.drawable.dropdown_normal_holo_dark));
            mPopupMenu = new PopupMenu(context, mButton);
            mMenu = mPopupMenu.getMenu();
            mPopupMenu.getMenuInflater().inflate(menuId, mMenu);
            mPopupMenu.setOnMenuItemClickListener(listener);
            mButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    mPopupMenu.show();
                }
            });
        }
 
        public MenuItem findItem(int id) {
            return mMenu.findItem(id);
        }
 
        public void setTitle(CharSequence title) {
            mButton.setText(title);
        }
    }
 
 
 
    private Context mContext;
    private ArrayList<DropDownMenu> mMenus;
    private OnMenuItemClickListener mListener;
 
    public CustomMenu(Context context) {
        mContext = context;
        mMenus = new ArrayList<DropDownMenu>();
    }
 
    public DropDownMenu addDropDownMenu(Button button, int menuId) {
        DropDownMenu menu = new DropDownMenu(mContext, button, menuId, this);
        mMenus.add(menu);
        return menu;
    }
 
    public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
        mListener = listener;
    }
 
    public MenuItem findMenuItem(int id) {
        MenuItem item = null;
        for (DropDownMenu menu : mMenus) {
            item = menu.findItem(id);
            if (item != null) return item;
        }
        return item;
    }
 
    public void setMenuItemAppliedEnabled(int id, boolean applied, boolean enabled,
            boolean updateTitle) {
        MenuItem item = null;
        for (DropDownMenu menu : mMenus) {
            item = menu.findItem(id);
            if (item != null) {
                item.setCheckable(true);
                item.setChecked(applied);
                item.setEnabled(enabled);
                if (updateTitle) {
                    menu.setTitle(item.getTitle());
                }
            }
        }
    }
 
    public void setMenuItemVisibility(int id, boolean visibility) {
        MenuItem item = findMenuItem(id);
        if (item != null) {
            item.setVisible(visibility);
        }
    }
 
    public boolean onMenuItemClick(MenuItem item) {
        if (mListener != null) {
            return mListener.onMenuItemClick(item);
        }
        return false;
    }
}
posted on 2013-03-25 15:33  zhengbeibei  阅读(5236)  评论(1编辑  收藏  举报