您的位置:首页 > 移动开发 > Android开发

Android中的菜单-ContextMenu,PopupMenu

2015-09-12 11:47 639 查看

在上一篇中我们介绍了OptionMenu,我们现在接着来说ContextMenu,PopupMenu。

这些菜单都基本类似,首先是菜单的构建方式,跟OptionMenu不同的是,它是调用onCreateContextMenu来构建菜单的。构建代码如下。

main2.xml--
<item
        android:id="@+id/action2_settings"
        android:icon="@drawable/menu_icon_query"
        android:title="@string/action_settings">
    </item>
    <item
        android:id="@+id/action2_second"
        android:icon="@drawable/menu_icon_history"
        android:title="@string/action_second"/>
    <item
        android:id="@+id/action2_third"
        android:icon="@drawable/menu_icon_submit"
        android:title="@string/action_third"/>
    <item
        android:id="@+id/action2_forth"
        android:icon="@drawable/menu_icon_update"
        android:title="@string/action_forth"/>
//菜单构建
@Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main2, menu);
    }


为了区分上一节中的菜单xml文件,这里我们使用另外一个不同名字和各自不同id的菜单资源配置文件。这个跟OptionMenu不一样,并不是构建了就可以看到的,这个是上下文菜单,唤出方式不一样,因为是上下文菜单,所以我们就必须为他在上下文中注册才行。

text = (TextView) findViewById(R.id.textClick);
        text.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
        registerForContextMenu(text);//注册的view组件


这时候再进去,发现还是没有菜单,别急,你需要长按text控件就可以看到的菜单了。



在注册组件之后。长按就可以唤出contextMenu,在很多地方我们都可以看到这个的应用。唤出了菜单,自然我们就需要对菜单时间进行监听,contextMenu监听方式如下代码:

@Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.action2_settings:
            Toast.makeText(MainActivity.this, "这是第一个菜单。", Toast.LENGTH_SHORT)
                    .show();
            return true;
        case R.id.action2_second:
            Toast.makeText(MainActivity.this, "这是第二个菜单。", Toast.LENGTH_SHORT)
                    .show();
            return true;
        case R.id.action2_third:
            Toast.makeText(MainActivity.this, "这是第三个菜单。", Toast.LENGTH_SHORT)
                    .show();
            return true;
        case R.id.action2_forth:
            Toast.makeText(MainActivity.this, "这是第四个菜单。", Toast.LENGTH_SHORT)
                    .show();
            return true;

        default:
            return super.onContextItemSelected(item);
        }

    }


在里面的toast可以换成你需要的操作。

还有一种其他模式,叫contextual action mode,中文也不知道是什么意思,反正就是另外一种模式的唤出方式。这种模式经常在打开手机文件的时候,长按列表的时候会弹出的一个修改了actionbar的展示方式的界面,以前我还以为是在长按的时候触发监听,切换了布局,没想到有这么简单的实现方式。





代码实现方式:

/***
     * 这个继承 mode action , 完成menu界面的绘制,以及前后的一些处理
     */
    private ActionMode.Callback mActionModeCallBack = new ActionMode.Callback() {

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mActionMode = null;
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.main2, menu);
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            // TODO Auto-generated method stub
            return false;
        }
    };
        /**
        *这个则类似对view对象进行注册,唤出界面。,
        */
        text = (TextView) findViewById(R.id.textClick);
        text.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);

        text.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                if (mActionMode != null) {
                    return false;
                }
                mActionMode = startActionMode(mActionModeCallBack);
                v.setSelected(true);
                return true;
            }
        });


这两个就是长按前和长按的对比,这样看也许还不是很明显之间的区别,他们之间的区别在于可以批量的操作,加上ListView之后,你应该就会很清楚他们之间的区别了。接下来就把这个应用到ListView上。



看到这幅图,大家大概都知道这个的用处了吧。这个可以长期停留在这个界面,并且可以进行多次菜单点击操作以及批量的操作。

list = (ListView) findViewById(R.id.list);
        list.setAdapter(new MyAdapter(this));
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        list.setMultiChoiceModeListener(new MultiChoiceModeListener() {

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // 当不做操作的时候返回false,做了操作之后,就要返回true,否则无法执行操作。
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                mode.getMenuInflater().inflate(R.menu.main2, menu);
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                switch (item.getItemId()) {
                case R.id.action2_settings:
                    Toast.makeText(MainActivity.this, "这是第一个菜单。",
                            Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.action2_second:
                    Toast.makeText(MainActivity.this, "这是第二个菜单。",
                            Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.action2_third:
                    Toast.makeText(MainActivity.this, "这是第三个菜单。",
                            Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.action2_forth:
                    Toast.makeText(MainActivity.this, "这是第四个菜单。",
                            Toast.LENGTH_SHORT).show();
                    return true;

                default:
                    return false;
                }
            }

            @Override
            public void onItemCheckedStateChanged(ActionMode mode,
                    int position, long id, boolean checked) {
                // TODO Auto-generated method stub
            }
        });


接下来再看一看PopupMenu:

这是一种类似spinner的弹出框菜单,在你点点击了某个view之后,就会跟spinner一样下拉式的弹出菜单列表。这种菜单通过代码来创建实例,然后利用这个实例来把xml文件构建成菜单项。实例则是通过传入上下文和唤出这个菜单的view来构造实例。

popupMenu = new PopupMenu(this, text);
        popupMenu.inflate(R.menu.main2);
        text.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // d = getResources().getDrawable(R.drawable.car1);
                // invalidateOptionsMenu();
                popupMenu.show();
            }
        });


点击text就可以显示出这个菜单了,如下图。



对于事件的点击监听也是跟之前类似的回调方法实现。图方便就直接toast,完全可以跟前面一样的switch来实现点击事件的处理。

popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, item.getTitle().toString(),
                        Toast.LENGTH_SHORT).show();
                return true;
            }
        });
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: