文章目录
- Menu分类
- Option
- option.xml
- 代码实现
- context.xml
- 绑定view
- 代码实现
- 代码实现
- popup.xml
- 代码实现
记录三种menu的基本使用方法
IDE:Android Studio 4.0
Menu分类
- 选项菜单OptionMenu
- 上下文菜单ContextMenu
- 弹出菜单PopupMenu
Option
option.xml
showAsAction属性值
always:直接在标题栏显示
never:不显示
withText:控制图标和文本一起显示
ifRoom:有空间就显示
<?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\"><itemandroid:id=\"@+id/save\"android:title=\"保存\"app:showAsAction=\"always\" /><itemandroid:id=\"@+id/setting\"android:title=\"设置\" /><item android:title=\"更多\"><menu><itemandroid:id=\"@+id/exit\"android:title=\"退出\" /><item android:title=\"子菜单1\" /></menu></item></menu>
代码实现
实现起来相对比较容易,在选中方法里直接用
switch
来判断用户点击的是哪一个选项
//创建OptionMenu@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//加载菜单资源getMenuInflater().inflate(R.menu.option, menu);return true;}//OptionMenu菜单项的选中方法@Overridepublic boolean onOptionsItemSelected(@NonNull 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;}return super.onOptionsItemSelected(item);}
Context
context.xml
<?xml version=\"1.0\" encoding=\"utf-8\"?><menu xmlns:android=\"http://schemas.android.com/apk/res/android\"><itemandroid:id=\"@+id/delete\"android:title=\"删除\" /><itemandroid:id=\"@+id/rename\"android:title=\"重命名\" /></menu>
绑定view
这里绑定的是
ctx_btn
长按
ctx_btn
效果
代码实现
先在onCreate方法中进行注册,绑定某个view
registerForContextMenu(findViewById(R.id.ctx_btn));
创建 覆盖onCreateContextMenu方法
//创建ContextMenu@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {getMenuInflater().inflate(R.menu.context, menu);}
菜单项的操作 覆盖onContextItemSelected方法
//Context菜单的操作@Overridepublic boolean onContextItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.delete:Toast.makeText(this, \"删除\", Toast.LENGTH_SHORT).show();break;case R.id.rename:Toast.makeText(this, \"重命名\", Toast.LENGTH_SHORT).show();break;}return super.onContextItemSelected(item);}
绑定上下文
长按
ctx_btn
效果
代码实现
实现ActionMode.CallBack方法,并传给对象
cb
ActionMode.Callback cb = new ActionMode.Callback() {//创建,在启动上下文模式(startActionMode(Callback))时调用@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {//这里要返回trueLog.e(\"TAG\", \"创建\");getMenuInflater().inflate(R.menu.context, menu);return true;}//在创建方法后调用@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {Log.e(\"TAG\", \"准备\");return false;}//点击时调用@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {//这里同样要返回trueLog.e(\"TAG\", \"点击\");switch (item.getItemId()) {case R.id.delete:Toast.makeText(MainActivity.this, \"删除\", Toast.LENGTH_SHORT).show();break;case R.id.rename:Toast.makeText(MainActivity.this, \"重命名\", Toast.LENGTH_SHORT).show();break;}return true;}//上下文操作模式结束时调用@Overridepublic void onDestroyActionMode(ActionMode mode) {Log.e(\"TAG\", \"结束\");}};
在onCreate方法中通过长按监听器启动上下文操作模式
findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {startActionMode(cb);return false;}});
Popup
点击
popBtn
效果
popup.xml
<?xml version=\"1.0\" encoding=\"utf-8\"?><menu xmlns:android=\"http://schemas.android.com/apk/res/android\"><itemandroid:id=\"@+id/copy\"android:title=\"复制\" /><itemandroid:id=\"@+id/paste\"android:title=\"粘贴\" /></menu>
代码实现
final Button popBtn=findViewById(R.id.pop_btn);popBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//实例化PopupMenu对象(参数2:被锚定的view)PopupMenu menu =new PopupMenu(MainActivity.this,popBtn);//加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中//将R.menu.xx对应的菜单资源加载到弹出式菜单中menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu());//为PopupMenu设置点击监听器menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {switch(item.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;}});//最后要记得show一下menu.show();}});