安卓学习 之 选项菜单(OptionMenu)

发布于:2025-09-15 ⋅ 阅读:(13) ⋅ 点赞:(0)

新建一个安卓的资源目录:

选择menu之后ok:

之后就新建了一个menu资源文件夹,在新建一个资源文件:

在AndroidManifest.xml中的<application>标签中添加android:theme="@style/Theme.AppCompat.Light.DarkActionBar"确保Activity使用的是包含ActionBar的主题:(否则将不显示菜单)

然后往option资源文件中写入菜单代码:

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

    <item
        android:id="@+id/action_save"
        android:title="保存"
        app:showAsAction="ifRoom"/>

    <item
        android:id="@+id/action_browse"
        android:title="浏览"
        app:showAsAction="ifRoom"/>

    <item
        android:id="@+id/action_more"
        android:title="更多操作"
        app:showAsAction="never">
        <menu>
            <item
                android:id="@+id/action_submenu1"
                android:title="子菜单1"/>
            <item
                android:id="@+id/action_submenu2"
                android:title="子菜单2"/>
        </menu>
    </item>
</menu>

还需要重写创建菜单的方法:

package com.example.myapplication3;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }

    @Override  //重写创建菜单的方法
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.option,menu); //获取菜单对象

        return true;
    }
}

好现在就可以运行一下看看效果了:

下面来看看item的属性:

android:id - 菜单项的唯一标识符(必需)
android:title - 菜单项显示的文本
app:showAsAction - 控制菜单项显示位置和行为
android:icon - 菜单项的图标
app:actionViewClass - 指定自定义视图类
android:checkable - 设置菜单项是否可勾选
android:visible - 控制菜单项可见性

写菜单时修改以上这些属性就ok了。

接下来就是写每个菜单被点击时,应该做出的反应了:

为每一个菜单项来添加一种处理方式:

package com.example.myapplication3;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }

    @Override  //重写创建菜单的方法
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.option,menu); //获取菜单对象

        return true;
    }


//菜单的点击事件出来方法:*************************************************************
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {


        if (item.getItemId() == R.id.action_save) {
            //处理保存操作
            Toast.makeText(this, "点击了保存菜单", Toast.LENGTH_SHORT).show();
        }
        if (item.getItemId() == R.id.action_browse) {
            // 处理浏览操作
            Toast.makeText(this, "点击了浏览菜单", Toast.LENGTH_SHORT).show();
        }
        if (item.getItemId() == R.id.action_submenu1) {
            // 处理子菜单1操作
            Toast.makeText(this, "点击了子菜单1", Toast.LENGTH_SHORT).show();
        }
        if (item.getItemId() == R.id.action_submenu2) {
            // 处理子菜单2操作
            Toast.makeText(this, "点击了子菜单2", Toast.LENGTH_SHORT).show();
        }

        return false;
    }

}

最终的程序效果就是点击哪个按钮都会弹出一个该按钮被点击的提示框: