Android 控件 之 菜单(Menu)

Menu(菜单) 简介

  • Android 中的 Menu(菜单)主要有如下几种:
  1. OptionMenu:选项菜单,android 中最常见的菜单,通过 Menu 键来调用
  2. SubMenu:子菜单,android 中点击子菜单将弹出一个显示子菜单项的悬浮框, 子菜单不支持嵌套,即不能包括其他子菜单
  3. ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单
  4. 官方文档:menus

OptionMenu( 选项菜单)

  • 使用 OptionMenu 步骤如下:
  • 在 activity 中重写如下两个方法就好,它们都在 android.app.Activity 类中已经定义好了
  • public boolean onCreateOptionsMenu(Menu menu):调用 OptionMenu,在这里完成菜单初始化
  • public boolean onOptionsItemSelected(MenuItem item):菜单项被选中时触发,这里完成事件处理

当然除了上面这两个方法还可以重写以下三个方法:

  • public void onOptionsMenuClosed(Menu menu):菜单关闭会调用该方法
  • public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示前会调用该方法, 可在这里进行菜单的调整(动态加载菜单列表)
  • public boolean onMenuOpened(int featureId, Menu menu):选项菜单打开以后会调用这个方法

menu. add

  • 直接在 Java 代码中设置菜单。如下所示,效果是点击菜单项中的颜色之后 " Hello Wolrd "则变成相应的颜色。

  • 实现上图效果代码如下,布局文件内容:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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=".MainActivity">

    <TextView
        android:id="@+id/color_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
  • MainActivity 代码如下:
package com.example.administrator.helloworld;

import android.graphics.Color;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 一个应用程序可以有1个或多个活动,而没有任何限制。
 * 每个为应用程序所定义的活动都需要在 AndroidManifest.xml 中声明,应用的主活动的意图过滤器标签中需要包含 MAIN 动作和 LAUNCHER 类别
 * 如果 MAIN 动作还是 LAUNCHER 类别没有在活动中声明,那么应用程序的图标将不会出现在主屏幕的应用列表中。
 */
public class MainActivity extends AppCompatActivity {

    /**
     * 定义不同颜色的菜单项唯一标识:
     */
    final private int RED = 110;
    final private int GREEN = 111;
    final private int BLUE = 112;
    final private int YELLOW = 113;
    final private int GRAY = 114;
    final private int CYAN = 115;
    final private int BLACK = 116;

    private TextView color_text;

    /**
     * 当活动第一次被创建时调用
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 从项目的 res/layout 中的XML文件加载 UI 组件
         * android.util.Log#d(java.lang.String, java.lang.String) 方法用于在 Logcat 窗口中打印日志
         */
        setContentView(R.layout.activity_main);
        Log.d("Android Message:", "The onCreate() event");

        color_text = findViewById(R.id.color_text);
    }

    /**
     * 方法在 android.app.Activity 类中已经定义好了
     * 调用 OptionMenu,在这里完成菜单初始化
     *
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        /**
         * add(int groupId, int itemId, int order, CharSequence title),为菜单添加选项
         * 1)groupId:菜单组 标识
         * 2)itemId:菜单项标识,当用户点击菜单的时候,需要根据这个标识来判断,点击的是谁
         * 3)order:菜单排序,数值越小越排在前
         * 4)title:菜单名称
         */
        menu.add(1, RED, 4, "红色");
        menu.add(1, GREEN, 2, "绿色");
        menu.add(1, BLUE, 3, "蓝色");
        menu.add(1, YELLOW, 1, "黄色");
        menu.add(1, GRAY, 5, "灰色");
        menu.add(1, CYAN, 6, "蓝绿色");
        menu.add(1, BLACK, 7, "黑色");
        return true;
    }

    /**
     * 方法在 android.app.Activity 类中已经定义好了
     * 菜单项被选中时触发,这里完成事件处理
     *
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        /**
         * int getItemId():获取菜单项id标识
         * int getGroupId():获取菜单项所在组的id标识
         * int getOrder():获取菜单项的排序号
         */
        int itemId = item.getItemId();
        System.out.println("click Item Id>>>" + itemId);

        /**根据不同的颜色,改变文本的颜色*/
        switch (itemId) {
            case RED:
                color_text.setTextColor(Color.RED);
                break;
            case GREEN:
                color_text.setTextColor(Color.GREEN);
                break;
            case BLUE:
                color_text.setTextColor(Color.BLUE);
                break;
            case YELLOW:
                color_text.setTextColor(Color.YELLOW);
                break;
            case GRAY:
                color_text.setTextColor(Color.GRAY);
                break;
            case CYAN:
                color_text.setTextColor(Color.CYAN);
                break;
            case BLACK:
                color_text.setTextColor(Color.BLACK);
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

menu. xml

  • 另外还可以通过 XML 方式定义 Menu,举个简单的例子,如下所示为 菜单的 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_setting"
        android:title="设置" />
    <item
        android:id="@+id/menu_help"
        android:title="帮助" />
</menu>
  • 布局文件仍然和之前的一样,不同点在 Activity 中,如下所示:
package com.example.administrator.helloworld;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

/**
 * 一个应用程序可以有1个或多个活动,而没有任何限制。
 * 每个为应用程序所定义的活动都需要在 AndroidManifest.xml 中声明,应用的主活动的意图过滤器标签中需要包含 MAIN 动作和 LAUNCHER 类别
 * 如果 MAIN 动作还是 LAUNCHER 类别没有在活动中声明,那么应用程序的图标将不会出现在主屏幕的应用列表中。
 */
public class MainActivity extends AppCompatActivity {

    /**
     * 当活动第一次被创建时调用
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 从项目的 res/layout 中的XML文件加载 UI 组件
         * android.util.Log#d(java.lang.String, java.lang.String) 方法用于在 Logcat 窗口中打印日志
         */
        setContentView(R.layout.activity_main);
        Log.d("Android Message:", "The onCreate() event");
    }

    /**
     * 方法在 android.app.Activity 类中已经定义好了
     * 调用 OptionMenu,在这里完成菜单初始化
     *
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        /**
         * 不再使用 Menu.add 的方法,而是从 xml 中加载
         * android.support.v7.app.AppCompatActivity#getMenuInflater()
         */
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.setting_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    /**
     * 方法在 android.app.Activity 类中已经定义好了
     * 菜单项被选中时触发,这里完成事件处理
     *
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        /**
         * int getItemId():获取菜单项id标识,此时是随机生成的
         * int getGroupId():获取菜单项所在组的id标识
         * int getOrder():获取菜单项的排序号
         * CharSequence getTitle():获取菜单的名称
         */
        int itemId = item.getItemId();
        CharSequence menuTitle = item.getTitle();

        System.out.println("\r\nclick Item Id>>>" + itemId);
        System.out.println("\r\nclick Item Id>>>" + menuTitle);

        return super.onOptionsItemSelected(item);
    }
}

控制台输出:

I/ViewRootImpl: CPU Rendering VSync enable = true
I/System.out: click Item Id>>>2131165259
              click Item Id>>>设置
I/ViewRootImpl: CPU Rendering VSync enable = true
I/System.out: click Item Id>>>2131165258
I/System.out: click Item Id>>>帮助
I/ViewRootImpl: CPU Rendering VSync enable = true
I/System.out: click Item Id>>>2131165259
              click Item Id>>>设置

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/82781469