目录
Menu(菜单) 简介
Android 中的 Menu(菜单)主要有如下几种:
OptionMenu:选项菜单,android 中最常见的菜单,通过 Menu 键来调用
SubMenu:子菜单,android 中点击子菜单将弹出一个显示子菜单项的悬浮框, 子菜单不支持嵌套,即不能包括其他子菜单
ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单
官方文档:menus
OptionMenu( 选项菜单)
1、使用 OptionMenu 步骤如下:
2)在 activity 中重写如下两个方法就好,它们都在 android.app.Activity 类中已经定义好了
public boolean onCreateOptionsMenu(Menu menu):调用 OptionMenu,在这里完成菜单初始化
public boolean onOptionsItemSelected(MenuItem item):菜单项被选中时触发,这里完成事件处理
3、当然除了上面这两个方法还可以重写以下三个方法:
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 代码如下:
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 中,如下所示:
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>>>设置