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

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

main2.xml--"@+id/action2_settings"        android:icon="@drawable/menu_icon_query"        android:title="@string/action_settings">    </item>    "        android:icon="@drawable/menu_icon_history"        android:title="@string/action_second"/>    @+id/action2_third"        android:icon="@drawable/menu_icon_submit"        android:title="@string/action_third"/>    @+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;            }        });

更多相关文章

  1. [Android]Service和Activity双向通信的两种方式
  2. android netd和kernel&frameworks的通信逻辑
  3. Android中Gallery和ImageSwitcher同步自动(滚动)播放图片库
  4. android AlertDialog对话框
  5. android Java 提交数据到服务器的两种方式中四种方法
  6. Android(安卓)中ActionBar+fragment实现页面导航的实例
  7. android学习之ListView如何使用
  8. Android(安卓)WiFi直连 双向通信
  9. android EditText 字数监听并显示

随机推荐

  1. Android世界下的悲慘升級故事
  2. Android如何让Handler中内部run停止(runna
  3. java.net.UnknownServiceException: CLEA
  4. Android换肤功能设计与实现(5)——网络加载
  5. Android 动画系列之逐帧(Frame)动画详解
  6. android 获取定位坐标,在百度地图出现大偏
  7. Android通过Wifi来调试你的应用(转自stor
  8. Android Camer2与Camera1 自定义相机拍照
  9. Android Studio 调试过程中快捷查看断点
  10. 去抖音面试被问到硬编码与软编码区别,如何