我是靠谱客的博主 冷艳流沙,最近开发中收集的这篇文章主要介绍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文件如下:

<?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文件如下:

package 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:

<?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>

先看下上下文菜单在屏幕空间旁显示的代码实现:

package 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);
    }

下面看一下上下文菜单出现在菜单栏中的实现:

package 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文件如下:

<?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代码如下:

package 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 Menu介绍2 选项菜单(OptionMenu)3 上下文菜单(ContextMenu)4 弹出菜单(PopupMenu)5 关于菜单的注意事项所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部