Android之旅-3-三种Menu的使用(Option Menu、Sub Menu、Context Menu)

一、选项菜单(Option Menu)

Tips: 选项菜单出现在标题栏右侧,如果设置了无标题栏那就看不见了

1.1 效果图:

Android之旅-3-三种Menu的使用(Option Menu、Sub Menu、Context Menu)_第1张图片

1.2 实现步骤

Tips:菜单项可以提前写好引用,也可以动态生成,下面步骤包含两种实现方式

1.2.1 在res→menu目录下创建菜单项main.xml(目录不存在就自己创建)

Android之旅-3-三种Menu的使用(Option Menu、Sub Menu、Context Menu)_第2张图片

1.2.2 main.xml代码


<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item1"
        android:title="@string/String1" />
    <item
        android:id="@+id/item2"
        android:title="@string/String2" />
menu>

1.2.3 Activity代码

/**
 * create by 星航指挥官
 * create on 2020/8/24
 * 我为天帝 当镇压世间一切敌
 * 遮天
 */
public class OptionsMenuActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_optionsmenu);
    }
    /*
    * 重写onCreateOptionsMenu()方法
    * 将菜单项显示出来
    * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
         /*
         * 通过getMenuInflater()方法得到MenuInflater对象
         * 再调用它的inflater()方法给当前活动创建菜单
         * 该方法有两个参数
         * 第一个参数用于指定我们通过哪一个资源文件来创建菜单
         * 第二个参数用于指定我们的菜单项将添加到哪一个Mune对象当中,这里使用传入的menu参数
         * */
        getMenuInflater().inflate(R.menu.main,menu);
        /*
        *如果没有在res/menu目录下创建main.xml
        * 也可用add()方法动态添加菜单项
        * menu.add(groupId,itemId,order,title)
        * groupId  分组ID;itemId 菜单项ID;order 排序;title 菜单名称;
        * 该方法返回一个Item,可以重新修改titel,也可以设置图标 但是API>=11不会显示
        * */
        MenuItem item = menu.add(1, 100, 1, "菜单项");
        item.setTitle("动态生成的菜单项1");
        menu.add(2, 101, 2, "动态生成的菜单项2");
        return true;
        /*
        * 然后给这个方法返回true,表示允许创建的菜单显示出来了
         * 如果返回为false,创建的菜单将无法显示
         * */
    }
    /*
    * 仅仅显示出来不够
    * 我们还要给菜单项添加点击事件
    * 重写onOptionsItemSelected()方法定义点击事件
    * */
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.item1:
                Toast.makeText(this,R.string.String1,Toast.LENGTH_SHORT).show();
                break;
            case R.id.item2:
                Toast.makeText(this,R.string.String2,Toast.LENGTH_SHORT).show();
                break;
            case 100:
                Toast.makeText(this,"动态生成的菜单项1",Toast.LENGTH_SHORT).show();
                break;
            case 101:
                Toast.makeText(this,"动态生成的菜单项2",Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

二、子菜单(Sub Menu)

将功能相同的操作分组显示,作用在OptionsMenu上,是OptionsMenu的二级菜单

2.1 效果图

Android之旅-3-三种Menu的使用(Option Menu、Sub Menu、Context Menu)_第3张图片

2.2 代码

/**
 * create by 星航指挥官
 * create on 2020/8/24
 * 我为天帝 当镇压世间一切敌
 * 遮天
 */
public class SubMenuActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_submenu);
    }
    /*
     * 重写onCreateOptionsMenu()方法
     * 将菜单项显示出来
     * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //使用addSubMenu()方法创建两个分组
        SubMenu Menu1 = menu.addSubMenu("分组一");
        SubMenu Menu2 = menu.addSubMenu("分组二");
        /*
         * 使用SubMenu.add()方法动态添加子菜单项
         * SubMenu.add(groupId,itemId,order,title)
         * groupId  分组ID;itemId 子菜单项ID;order 排序;title 子菜单名称;
         * */
        Menu1.add(1, 1, 1, "选项1");
        Menu1.add(1, 2, 1, "选项2");
        Menu1.add(1, 3, 1, "选项3");
        Menu2.add(2, 1, 1, "选项4");
        Menu2.add(2, 2, 1, "选项5");
        Menu2.add(2, 3, 1, "选项6");
        return true;
    }
    /*
     * 仅仅显示出来不够
     * 我们还要给菜单项添加点击事件
     * 重写onOptionsItemSelected()方法定义点击事件
     * */
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        /*
        * 先判断分组ID
        * 再判断子菜单项的ID
        * */
        if (item.getGroupId() == 1) {
            switch (item.getItemId()) {
                case 1:
                    Toast.makeText(this, "选项1", Toast.LENGTH_SHORT).show();
                    break;
                case 2:
                    Toast.makeText(this, "选项2", Toast.LENGTH_SHORT).show();
                    break;
                case 3:
                    Toast.makeText(this, "选项3", Toast.LENGTH_SHORT).show();
                    break;

                default:
                    break;
            }
        } else if (item.getGroupId() == 2) {
            switch (item.getItemId()) {
                case 1:
                    Toast.makeText(this, "选项4", Toast.LENGTH_SHORT).show();
                    break;
                case 2:
                    Toast.makeText(this, "选项5", Toast.LENGTH_SHORT).show();
                    break;
                case 3:
                    Toast.makeText(this, "选项6", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
        return super.onOptionsItemSelected(item);
    }
}

三、上下文菜单(Context Menu)

当用户长按Activity页面时,弹出的菜单称为上下文菜单。

ContextMenu与OptionMenu的区别:
1、OptionMenu对应的是activity,一个activity只能拥有一个选项菜单;
2、ContextMenu对应的是view,每个view都可以设置上下文菜单;
3、ContextMenu常用于ListView或者GridView

2.1 效果图

Android之旅-3-三种Menu的使用(Option Menu、Sub Menu、Context Menu)_第4张图片

2.2实现代码

大致分为两步,
1.创建listview并给listview注册上下文菜单
2.设置ContextMenu菜单项以及对应的响应事件

/**
 * create by 星航指挥官
 * create on 2020/8/24
 * 我为天帝 当镇压世间一切敌
 * 遮天
 */
public class ContextMenuActivity extends AppCompatActivity {
    private static final String TAG = "ContextMenuActivity";
    @BindView(R.id.listview)
    ListView listview;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载视图
        setContentView(R.layout.activity_contextmenu);
        //注解工具
        ButterKnife.bind(this);
        initview();
    }
   /*
   * 第一步,给listview设置适配器
   * 并注册上下文菜单
   * */
    private void initview() {
        /*
         *创建适配器
         * ArrayAdapter(数组适配器),最为基础简单的适配器,只能显示一行文字
         * 第一个参数是上下文对象
         *第二个参数是显示的item的样式,android已经定义好,可直接使用,也可使用自定义的TextView
         * 第三个参数是要显示的数据
         * tem的样式:
         *simple_list_item_1:单独的一行文本框
         *simple_list_item_2:有两个文本框组成
         *simple_list_item_checked每项都是由一个已选中的列表项
         *simple_list_item_multiple_choice:都带有一个复选框
         *simple_list_item_single_choice:都带有一个单选框
         * */
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new String[]{"劫过九重城关", "我坐下马正酣"});
        //listview设置适配器为adapter
        listview.setAdapter(adapter);
        //给listview注册上下文菜单
        //可别忘了
        this.registerForContextMenu(listview);
    }

    /**
     * 第二步重写onCreateContextMenu()方法添加上下文菜单的菜单项
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        //设置标题
        menu.setHeaderTitle("ContextMenu");
        //设置图标
        menu.setHeaderIcon(R.mipmap.shuguang);
        //add()方法添加菜单项,参数介绍参考OptionMenu
        menu.add(1, 1, 1, "已读");
        menu.add(1, 2, 2, "删除");
    }

    /**
     * 第三步重写onContextItemSelected()方法创建单击事件
     */
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        // 得到当前被选中的item信息
        AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        Log.i(TAG, "context item seleted ID="+ menuInfo.id);
        switch (item.getItemId()) {
            case 1:
                Toast.makeText(this, ("第"+menuInfo.id+"项已读"), Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(this, ("第"+menuInfo.id+"项删除"), Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onContextItemSelected(item);
    }
}

kee

你可能感兴趣的:(AndroidStudio,android,android,studio)