Android——三种基本类型Menu(OptionsMenu、ContextMenu和PopupMenu)

菜单是许多应用类型中常见的界面组件。如要提供熟悉且一致的用户体验,您应使用 Menu API 呈现 Activity 中的用户操作和其他选项。
Android 版本中三种基本菜单或操作呈现效果的创建方法:

选项菜单和应用栏
选项菜单是某个 Activity 的主菜单项集合,供您放置对应用产生全局影响的操作,如“搜索”、“撰写电子邮件”和“设置”。
要实现选项菜单的功能,首先需要重载 OnCreatOptionsMenu() 方法创建菜单,然后通过 onOptionsItemSelected() 方法对菜单被单击事件进行监听和处理。
具体使用步骤如下:
一、在工程的 res 目录下创建一个 menu 目录,用于存放菜单相关的 XML 文件。在该目录下创建 options_menu.xml。
代码如下:
options_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 子菜单 -->
    <item
        android:id="@+id/paren"
        android:title="Item">
        <menu>
            <item
                android:id="@+id/menu_sub1"
                android:title="Item" />
            <item
                android:id="@+id/menu_sub2"
                android:title="Item" />
        </menu>
    </item>
    <item
        android:id="@+id/menu_delete"
        android:title="删除"
        app:showAsAction="never" />
    <item
        android:id="@+id/menu_new"
        android:title="新建"
        app:showAsAction="never" />
</menu>

二、创建一个activity命名为OptionsMenuActivity,重载 OnCreatOptionsMenu() 方法和 onOptionsItemSelected() 方法。
OptionsMenuActivity.java

//创建选项菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.options_menu,menu);

        return true;
    }

    //给菜单选项设置执行命令
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_new:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了新建",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.menu_delete:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了删除",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.menu_sub1:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了子菜单1",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.menu_sub2:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了子菜单2",Toast.LENGTH_SHORT)
                        .show();
                return true;

                default:
                    return false;
        }
    }

详细代码如下:
OptionsMenuActivity.java

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class OptionsMenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //创建选项菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.options_menu,menu);

        return true;
    }

    //给菜单选项设置执行命令
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_new:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了新建",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.menu_delete:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了删除",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.menu_sub1:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了子菜单1",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.menu_sub2:
                Toast.makeText(OptionsMenuActivity.this,
                        "点击了子菜单2",Toast.LENGTH_SHORT)
                        .show();
                return true;

            default:
                return false;
        }
    }

上下文菜单
上下文菜单是用户长按某元素时出现的浮动菜单。该菜单提供的操作会影响所选内容或上下文框架,使用方法与选项菜单类似。
具体使用步骤如下:
一、在工程的 res 目录下创建一个 menu 目录,用于存放菜单相关的 XML 文件。在该目录下创建 context_menu.xml。
代码如下:
context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/context1"
        android:title="Item" />
    <item
        android:id="@+id/context2"
        android:title="Item" />
    <item
        android:id="@+id/context3"
        android:title="Item" />
</menu>

二、创建一个activity命名为ContextMenuActivity,重载 onCreateContextMenu() 方法和 onContextItemSelected() 方法,另外需要注意的是要通过方法registerForContextMenu( View v )为元素添加上下文菜单,通过长按元素激活。
ContextMenuActivity.java

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class ContextMenuActivity extends AppCompatActivity {

    private TextView tv1;
    private TextView tv2;
    private TextView tv3;
    private TextView tv4;
    private TextView tv5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_context_menu);

        tv1 = findViewById(R.id.tv1);
        tv2 = findViewById(R.id.tv2);
        tv3 = findViewById(R.id.tv3);
        tv4 = findViewById(R.id.tv4);
        tv5 = findViewById(R.id.tv5);


        //为控件注册上下文菜单
        registerForContextMenu(tv1);
        registerForContextMenu(tv2);
        registerForContextMenu(tv3);
        registerForContextMenu(tv4);
        registerForContextMenu(tv5);
    }

    //创建上下文菜单
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        getMenuInflater().inflate(R.menu.context_menu,menu);
    }

    //给菜单选项设置执行命令
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()){
            case R.id.context1:
                Toast.makeText(ContextMenuActivity.this,
                        "点击了1",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.context2:
                Toast.makeText(ContextMenuActivity.this,
                        "点击了2",Toast.LENGTH_SHORT)
                        .show();
                return true;
            case R.id.context3:
                Toast.makeText(ContextMenuActivity.this,
                        "点击了3",Toast.LENGTH_SHORT)
                        .show();
                return true;

                default:
                    return false;
        }
    }
}

activity_context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ContextMenuActivity">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView1"
        android:textSize="30sp"
        app:layout_constraintTop_toBottomOf="@+id/tv2" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView1"
        android:textSize="30sp"
        app:layout_constraintTop_toBottomOf="@+id/tv3"
        tools:layout_editor_absoluteX="176dp" />

    <TextView
        android:id="@+id/tv3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView1"
        android:textSize="30sp"
        app:layout_constraintTop_toBottomOf="@+id/tv4"
        tools:layout_editor_absoluteX="16dp" />

    <TextView
        android:id="@+id/tv4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView1"
        android:textSize="30sp"
        app:layout_constraintTop_toBottomOf="@+id/tv5"
        tools:layout_editor_absoluteX="16dp" />

    <TextView
        android:id="@+id/tv5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView1"
        android:textSize="30sp"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

弹出菜单
弹出菜单以垂直列表形式显示一系列项目,并且该列表会固定到调用该菜单的视图中。它特别适用于提供与特定内容相关的大量操作,或者为命令的另一部分提供选项。弹出菜单中的操作不会直接影响对应的内容,而上下文操作则会对其产生影响。相反,弹出菜单适用于与 Activity 中的内容区域相关的扩展操作。使用较前面两种复杂一些。
具体使用方法如下:
一、在工程的 res 目录下创建一个 menu 目录,用于存放菜单相关的 XML 文件。在该目录下创建 popup_menu.xml。
代码如下:
popup_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menutest03.MainActivity" >

    <item
        android:id="@+id/copy"
        android:orderInCategory="100"
        android:title="复制"/>

    <item
        android:id="@+id/delete"
        android:orderInCategory="100"
        android:title="粘贴"/>

</menu>

二、创建一个activity命名为PopupMenuActivity,在使用弹出式菜单时需要完成以下步骤:

  1. 创建弹出式菜单实例
  2. 获取菜单填充实例
  3. 填充菜单
  4. 为弹出菜单项设置监听事件
  5. 展示弹出式菜单
 //				创建弹出式菜单实例
                PopupMenu popupMenu = new PopupMenu(PopupMenuActivity.this,v);
//                获取菜单填充实例
                MenuInflater inflater = popupMenu.getMenuInflater();
//                填充菜单
                inflater.inflate(R.menu.popup_menu,popupMenu.getMenu());
//                为弹出菜单项设置监听事件
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {……});
//                ****展示弹出式菜单****
                popupMenu.show();

详细代码如下:
PopupMenuActivity.java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;

public class PopupMenuActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_popup_menu);

        button = findViewById(R.id.btn1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                创建弹出式菜单实例
                PopupMenu popupMenu = new PopupMenu(PopupMenuActivity.this,v);
//                获取菜单填充实例
                MenuInflater inflater = popupMenu.getMenuInflater();
//                填充菜单
                inflater.inflate(R.menu.popup_menu,popupMenu.getMenu());
//                为弹出菜单项设置监听事件
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()){
                            case R.id.copy:
                                Toast.makeText(PopupMenuActivity.this,
                                        "点击了copy",Toast.LENGTH_SHORT)
                                        .show();
                                return true;
                            case R.id.paste:
                                Toast.makeText(PopupMenuActivity.this,
                                        "点击了delete",Toast.LENGTH_SHORT)
                                        .show();
                                return true;

                                default:
                                    return false;
                        }
                    }
                });
//                ****展示弹出式菜单****
                popupMenu.show();
            }
        });
    }


}

activity_popup_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PopupMenuActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="弹出式菜单"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.499" />
</androidx.constraintlayout.widget.ConstraintLayout>
发布了13 篇原创文章 · 获赞 4 · 访问量 4746

猜你喜欢

转载自blog.csdn.net/qq_43567345/article/details/104249562