android开发之使用上下文菜单
android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单。与OptionsMenu不同的是,ContextMenu是一个针对View的菜单,它绑定在某一个View上,而OptionsMenu是属于一个Activity的。
现在大部分浏览器都有长按复制的功能,如下图:
这种效果的实现是使用PopupWindow来实现的(关于PopupWindow的使用可以参见我的另一篇文章popupWindow使用详解
),虽然它和我们即将要说的ContextMenu很像。
好了,说了这么多,我们该说说怎么实现上下文菜单了。
实现上下文菜单一共三个步骤:
1.重写Activity或者Fragment中的onCreateContextMenu方法:
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("你想干啥?"); menu.setHeaderIcon(R.drawable.a4c); menu.add(0, 0, Menu.NONE, "复制"); menu.add(0, 1, Menu.NONE, "剪贴"); menu.add(0, 2, Menu.NONE, "重命名"); menu.add(1, 3, Menu.NONE, "去新的Activity"); }
2.重写Activity或者Fragment中的onContextItemSelected方法,实现菜单事件监听
@Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case 0: tv.setText(item.getTitle().toString()); break; case 1: tv.setText(item.getTitle().toString()); break; case 2: tv.setText(item.getTitle().toString()); break; case 3: tv.setText(item.getTitle().toString()); startActivity(new Intent(this, SecondActivity.class)); break; default: return super.onContextItemSelected(item); } return true; }
3.给View注册上下文菜单
tv = (TextView) this.findViewById(R.id.tv); this.registerForContextMenu(tv);
三个步骤实现了给一个TextView注册了上下文菜单事件,有时候我们会遇到另外情况,比如说要给ListView中的每一项都添加上下文菜单,而且当我们长按ListView该项的时候,我们还希望能够知道我们点击的是哪一个item,这个该怎么实现呢?AdapterContextMenuInfo专为解决这个问题而生,看看先下面的代码:
public class SecondActivity extends Activity { private ListView lv; private String[] menuStrs; private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); lv = (ListView) this.findViewById(R.id.lv); initListView(); this.registerForContextMenu(lv); } private void initListView() { menuStrs = new String[] { "庆历四年春", "滕子京谪守巴陵郡", "越明年", "政通人和" }; adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menuStrs); lv.setAdapter(adapter); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("你想干啥?"); menu.setHeaderIcon(R.drawable.a4c); menu.add(0, 0, Menu.NONE, "岳"); menu.add(0, 1, Menu.NONE, "阳"); menu.add(0, 2, Menu.NONE, "楼"); menu.add(1, 3, Menu.NONE, "记"); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item .getMenuInfo(); switch (item.getItemId()) { case 0: menuStrs[menuInfo.position] += "岳"; break; case 1: menuStrs[menuInfo.position] += "阳"; break; case 2: menuStrs[menuInfo.position] += "楼"; break; case 3: menuStrs[menuInfo.position] += "记"; break; default: return super.onContextItemSelected(item); } adapter.notifyDataSetChanged(); return true; } }
前面的东西都很简单,我就不多说了,通过AdapterContextMenuInfo的实例我们可以拿到我们所点击item的position,id等,我们这里实现的一个效果就是点击上下文菜单之后在每个item View后面添加一个字。
实现的效果如下图所示:
Demo下载https://github.com/lenve/contextMenu
版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。
蓝天为路,阳光满屋。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?