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; } });
相关文章推荐
- android---Notification通知解析
- [转载]android中The connection to adb is down,问题和解决
- Android 实现沉浸式状态栏的方法
- Android:Resources资源文件
- Android:布局实例之常见用户设置界面
- Android:res之selector背景选择器
- Android学习路线01
- Android:Tab切换方法整理
- Android简易数据存储之SharedPreferences
- android post方式传递参数并获取返回数据代码
- 【Android工具】DES终结者加密时报——AES加密演算法
- Android基础入门教程——7.5.2 WebView和JavaScrip交互基础
- Android控件之ImageView用法实例分析
- Activity的四种启动模式(LaunchMode)
- Android控件之AnalogClock与DigitalClock用法实例分析
- Android中设置TextView的颜色setTextColor
- 【Android进阶学习】监听EditText的变化
- 个人开源项目 第三方Git@OSC客户端
- Android Api Demos登顶之路(六十五)Graphics-->AlphaBitmap
- android selector(转)