(SubMenu)选项菜单和子菜单应用

菜单在桌面上应用广泛,几乎所有的桌面应用都有菜单。与桌面应用的菜单不同,Android应用中的菜单默认是看不见的,只有当用户按下手机上的"MENU"键时,系统才会显示该应用关联的菜单,这种菜单叫选项菜单(Option Menu)。
Android应用同样支持上下文菜单(ContextMenu),当用户一直按住某个组件时,该组件所关联的上下文菜单就会显示出来。

SubMenu继承了Menu,它就代表一个子菜单,额外提供了如下常用方法:

1.SubMenu setHeaderIcon(Drawable icon):设置菜单头的图标。
2.SubMenu setHeaderIcon(int iconRes):设置菜单头的图标。
3.SubMenu setHeaderTitle(int titleRes):设置菜单头的标题。
4.SubMenu setHeaderTitle(CharSequence title):设置菜单头的标题。
5.SubMenu setHeaderView(View view):使用View来设置菜单头。

下面的程序示范了如何为Andoid应用添加菜单和子菜单。如下是运行图:

menu1
menu2menu3
在layout下的activity_main.xml下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Main3Activity">


    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选项菜单测试"
        android:textSize="24dp"/>
</LinearLayout>

在MainActivity.java中:

package com.example.test05;

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

import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.TextView;
import android.widget.Toast;

public class Main3Activity extends AppCompatActivity {
//    定义“字体大小”菜单项标识
    private static final int FONT_10=0x111;
    private static final int FONT_12=0x112;
    private static final int FONT_14=0x113;
    private static final int FONT_16=0x114;
    private static final int FONT_18=0x115;
//    定义“普通菜单项”的标识
    private static final int PLAIN_ITEM=0x11b;
//    定义“字体颜色”菜单项标识
    private static final int FONT_RED=0x116;
    private static final int FONT_BLUE=0x117;
    private static final int FONT_GREEN=0x118;
    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        text=findViewById(R.id.text);
    }
//    当用户单击Menu按键时触发该方法
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
//        -------------向menu中添加“字体大小”的子菜单------------
        SubMenu fontmenu=menu.addSubMenu("字体大小");
//        设置菜单的图标
        fontmenu.setIcon(R.drawable.arrow);
//        设置菜单头的图标
        fontmenu.setHeaderIcon(R.drawable.arrow);
//        设置菜单头的标题
        fontmenu.setHeaderTitle("选择字体的大小");
        fontmenu.add(0,FONT_10,0,"10号字体");
        fontmenu.add(0,FONT_12,0,"12号字体");
        fontmenu.add(0,FONT_14,0,"14号字体");
        fontmenu.add(0,FONT_16,0,"16号字体");
        fontmenu.add(0,FONT_18,0,"18号字体");
//        --------------向menu中添加“普通菜单项”---------------
        menu.add(0,PLAIN_ITEM,0,"普通菜单项");
//        ----------------向menu中添加“字体颜色”的子菜单--------
        SubMenu colorMenu=menu.addSubMenu("字体颜色");
        colorMenu.setIcon(R.drawable.arrow);
//        设置菜单头的图标
        colorMenu.setHeaderIcon(R.drawable.arrow);
//        设置菜单头的标题
        colorMenu.setHeaderTitle("选择文字颜色");
        colorMenu.add(0,FONT_RED,0,"红色");
        colorMenu.add(0,FONT_BLUE,0,"蓝色");
        colorMenu.add(0,FONT_GREEN,0,"绿色");
        return super.onCreateOptionsMenu(menu);
    }
//    选项菜单的菜单项被单击后的回调方法
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem mi) {
//        判断单击的是哪个菜单项,针对性的做出回应
        switch (mi.getItemId()){
            case FONT_10:text.setTextSize(10*2);break;
            case FONT_12:text.setTextSize(12*2);break;
            case FONT_14:text.setTextSize(14*2);break;
            case FONT_16:text.setTextSize(16*2);break;
            case FONT_18:text.setTextSize(18*2);break;
            case FONT_RED:text.setTextColor(Color.RED);break;
            case FONT_BLUE:text.setTextColor(Color.BLUE);break;
            case FONT_GREEN:text.setTextColor(Color.GREEN);break;
            case PLAIN_ITEM:
                Toast.makeText(this, "您单击了普通菜单项",
                        Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }
}

用ContextMenu来代表上下文菜单
ContextMenu提供了如下的方法,同样可以为上下文菜单设置图标、标题等:
1.ContextMenu setHeaderIcon(Drawable icon):为上下文菜单设置图标。
2.ContextMenu setHeaderIcon(int iconRes):为上下文菜单设置图标。
3.ContextMenu setHeadeerTitle(int titleRes):为上下文菜单设置标题。

下面的程序示范了如何开发上下文菜单,运行图片如下:

menu4
在layout下的activity_main.xml下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="通过上下文菜单修改背景色"
        android:textSize="24dp"/>
</LinearLayout>

在MainActivity.java中:

package com.example.menuprogram;

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

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

public class MainActivity extends AppCompatActivity {
//    为菜单定义一个标识
    private static final int MENU1=0x111;
    private static final int MENU2=0x112;
    private static final int MENU3=0x113;
    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text=findViewById(R.id.text);
//        为文本框注册上下文菜单
        registerForContextMenu(text);
    }
//    创建上下文菜单时触发该方法
    @Override
    public void onCreateContextMenu(ContextMenu menu,
                                    View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.add(0,MENU1,0,"红色");
        menu.add(0,MENU2,0,"绿色");
        menu.add(0,MENU3,0,"蓝色");
//        将三个菜单项设为单选菜单项
        menu.setGroupCheckable(0,true,true);
//        设置上下文菜单的标题、图标
        menu.setHeaderIcon(R.drawable.arrow);
        menu.setHeaderTitle("选择背景色");
    }
//    上下文菜单的菜单项被单击时触发该方法
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case MENU1:text.setBackgroundColor(Color.RED);break;
            case MENU2:text.setBackgroundColor(Color.GREEN);break;
            case MENU3:text.setBackgroundColor(Color.BLUE);break;
        }
        return true;
    }
}

如果这篇文章对你有帮助,欢迎关注小白,给小白一个鼓励的赞吧,爱点赞的人运气都不会太差。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值