我是靠谱客的博主 冷艳流沙,这篇文章主要介绍Android中的Menu1 Menu介绍2 选项菜单(OptionMenu)3 上下文菜单(ContextMenu)4 弹出菜单(PopupMenu)5 关于菜单的注意事项,现在分享给大家,希望可以做个参考。
文章目录
- 1 Menu介绍
- 1.1 Menu的发展
- 1.2 菜单的分类
- 2 选项菜单(OptionMenu)
- 2.1 选项菜单的xml文件及java文件
- 3 上下文菜单(ContextMenu)
- 3.1 上下文菜单介绍
- 3.2 上下文操作菜单代码实现
- 4 弹出菜单(PopupMenu)
- 4.1 弹出菜单介绍
- 4.2 弹出式菜单的代码实现
- 5 关于菜单的注意事项
1 Menu介绍
1.1 Menu的发展
3.0以前的Menu:
- 在Android3.0,当用户按“菜单”按钮时,选项菜单的内容会出现在屏幕底部,可包含多达 6 个菜单项,超出部分则以“更多”来显示。
3.0以后的Menu:
- 在Android3.0及更高版本的系统中,选项菜单中的项目将出现在操作栏中,用户通过操作栏右侧的操作或者点击设备菜单按钮来溢出菜单图标。
1.2 菜单的分类
Menu分类
- 选项菜单(OptionMenu)
- 上下文菜单(ContextMenu)
- 弹出菜单(PopupMenu)
2 选项菜单(OptionMenu)
选项菜单是一个应用的主菜单项,用于放置对应用产生全局影响的操作,如搜索/设置。
2.1 选项菜单的xml文件及java文件
选项菜单我们需要创建在res目录下,如下图所示:
xml文件如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!--showAsAction属性值:always :直接在标题栏显示 never:不显示 withText:控制图标和文本一起显示 ifRoom:有空间就显示--> <item android:title="保存" android:id="@+id/save" android:icon="@mipmap/ic_launcher" app:showAsAction="always"/> <item android:title="设置" android:id="@+id/setting"/> <item android:title="更多操作" > <menu > <item android:title="退出" android:id="@+id/exit"/> <item android:title="子菜单2" /> <item android:title="子菜单3" /> </menu> </item> </menu>
对应的java文件如下:
复制代码
1
2
3
4
5
6
7
8
9
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
81package com.example.para_huang.imoocapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建OptionMenu @Override public boolean onCreateOptionsMenu(Menu menu) { //加载菜单资源 //通过XML资源来设计menu //getMenuInflater().inflate(R.menu.option,menu); //纯java代码设计menu /* 设置 更多 添加 删除 */ // Menu //参数1:组id 参数2:菜单项id 参数3:序号 参数4:设置 menu.add(1, 1, 1,"设置"); SubMenu sub = menu.addSubMenu(1,2,2,"更多"); // SubMenu sub.add(2,3,1,"添加"); sub.add(2,4,2,"删除"); //一定要记得返回true,否则菜单不显示 return true; } //OptionMenu菜单项的选中方法 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ // case R.id.save: // Toast.makeText(this,"保存",Toast.LENGTH_SHORT).show(); // break; // case R.id.setting: // Toast.makeText(this,"设置",Toast.LENGTH_SHORT).show(); // break; // case R.id.exit: // finish(); // break; case 1: Toast.makeText(this,"设置",Toast.LENGTH_SHORT).show(); break; case 2: Toast.makeText(this,"更多",Toast.LENGTH_SHORT).show(); break; case 3: Toast.makeText(this,"添加",Toast.LENGTH_SHORT).show(); break; case 4: Toast.makeText(this,"删除",Toast.LENGTH_SHORT).show(); break; default: super.onOptionsItemSelected(item); } return true; } }
3 上下文菜单(ContextMenu)
3.1 上下文菜单介绍
长按某个item不放,就会在屏幕中间弹出ContextMenu。当然我们也可以通过设置启动上下文操作模式,是的上下文菜单出现才菜单栏中。
3.2 上下文操作菜单代码实现
先来看下menu的xml:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/delete" android:title="删除" /> <item android:title="重命名" > <menu > <item android:id="@+id/opera1" android:title="操作1" /> <item android:id="@+id/opera2" android:title="操作2" /> </menu> </item> </menu>
先看下上下文菜单在屏幕空间旁显示的代码实现:
复制代码
1
2
3
4
5
6
7
8
9
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
53package com.example.para_huang.imoocapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //ctx_btn:演示ContextMenu //1.注册 registerForContextMenu(findViewById(R.id.ctx_btn)); //2.创建 覆盖onCreateContextMenu //3.菜单项的操作 覆盖onContextItemSelected } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.context,menu); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.delete: Toast.makeText(this,"删除",Toast.LENGTH_SHORT).show(); break; case R.id.opera1: Toast.makeText(this,"操作1",Toast.LENGTH_SHORT).show(); break; case R.id.opera2: Toast.makeText(this,"操作2",Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); }
下面看一下上下文菜单出现在菜单栏中的实现:
复制代码
1
2
3
4
5
6
7
8
9
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
81package com.example.para_huang.imoocapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //ctx_btn:演示ContextMenu //1.注册 //registerForContextMenu(findViewById(R.id.ctx_btn)); //2.创建 覆盖onCreateContextMenu //3.菜单项的操作 覆盖onContextItemSelected //4.为按钮设置上下文操作模式 //①实现ActionMode CallBack //②在view的长按事件中去启动上下文操作模式 findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { startActionMode(cb); return false; } }); } ActionMode.Callback cb = new ActionMode.Callback() { //创建,在启动上下文操作模式(startActionMode(Callback))时调用 @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { Log.e("TAG","创建"); getMenuInflater().inflate(R.menu.context,menu); return true; } //在创建方法后进行调用 @Override public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { Log.e("TAG","准备"); return false; } @Override public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { Log.e("TAG","点击"); switch (menuItem.getItemId()){ case R.id.delete: Toast.makeText(MainActivity.this,"删除",Toast.LENGTH_SHORT).show(); break; case R.id.opera1: Toast.makeText(MainActivity.this,"操作1",Toast.LENGTH_SHORT).show(); break; case R.id.opera2: Toast.makeText(MainActivity.this,"操作2",Toast.LENGTH_SHORT).show(); break; } return true; } //上下文操作模式结束时被调用 @Override public void onDestroyActionMode(ActionMode actionMode) { Log.e("TAG","结束"); } }; }
4 弹出菜单(PopupMenu)
4.1 弹出菜单介绍
一个模态形式展示的弹出风格的菜单,绑在某个View上,一般出现在被绑定的View的下方。
4.2 弹出式菜单的代码实现
简单的xml文件如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/copy" android:title="复制" /> <item android:id="@+id/paste" android:title="粘贴" /> </menu>
java代码如下:
复制代码
1
2
3
4
5
6
7
8
9
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
56package com.example.para_huang.imoocapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //popup_btn:演示PopupMenu final Button popupBtn = findViewById(R.id.popup_btn); popupBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //①实例化PopupMenu对象 (参数2:被锚定的view) final PopupMenu menu = new PopupMenu(MainActivity.this,popupBtn); //②加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中 //将R.menu.xx对于的菜单资源加载到弹出式菜单中 menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu()); //③为PopupMenu设置点击监听器 menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()){ case R.id.copy: Toast.makeText(MainActivity.this,"复制",Toast.LENGTH_SHORT).show(); break; case R.id.paste: Toast.makeText(MainActivity.this,"粘贴",Toast.LENGTH_SHORT).show(); break; } return false; } }); //④千万不要忘记这一步,显示PopupMenu menu.show(); } }); } }
其实我们可以对于菜单的操作只是一种范式而已,并没有什么技术难度。
5 关于菜单的注意事项
xml定义Menu的优势:
- 清晰的菜单结构
- 将菜单内容与应用的逻辑代码分离
- 资源适配更容易
xml定义的Menu不显示:
- onCreateOptionsMenu()方法必须返回true
- onOptionsItemSelected方法返回true
- 调用父类的默认实现
最后
以上就是冷艳流沙最近收集整理的关于Android中的Menu1 Menu介绍2 选项菜单(OptionMenu)3 上下文菜单(ContextMenu)4 弹出菜单(PopupMenu)5 关于菜单的注意事项的全部内容,更多相关Android中的Menu1内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复