欢迎莅临 SUN WU GANG 的园子!!!

世上无难事,只畏有心人。有心之人,即立志之坚午也,志坚则不畏事之不成。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  470 随笔 :: 0 文章 :: 22 评论 :: 30万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

菜单在桌面应用程序中使用非常广泛,由于手机屏幕的制约,菜单在手机应用中减少不少。

android应用中的菜单默认是不可见的,只有当用户单击手机上“Menu”键时,系统才会显示该应用关联的采用项。

android应用同样支持上下文菜单(ContentMenu),用户一直按住某个应用的界面时,该应用所关联上下文菜单就会显示出来。

 

选项菜单和子菜单SubMenu 

注意:android系统默认做到只有6个菜单位,超过6个菜单,系统将会在第6个菜单位显示“更多”。

android系统的菜单支持主要通过4个接口来提现:

  Menu、SubMenu、ContextMenu、MeunItem

==>SubMenu:代表一个普通菜单,可以包含N个MenuItem(N>=1);

  ContextMenu:代表一个子菜单,可以包含N个MeunItem;

Menu定义了如下方法添加菜单或菜单项:

  MenuItem add(int titileRes):添加一个新的菜单项;

  MenuItem add(int groupId,int itemId,int order,CharSequence title):添加一个新的处于groupId组的菜单项;

  MenuItem add(int groupId,int itemId,int order,int titleRes):添加一个新的处于groupId组的菜单项;

  MenuItem add(CharSequence title):添加一个新的菜单项;

  SubMenu addSubMenu(int titleRes):添加一个新的菜单项;

  SubMenu addSubMenu(int groupId,int itemId,int order,int titleRes):添加一个新的处于groupId组的子菜单;

  SubMenu addSubMenu(CharSequence title):添加一个新的子菜单;

  SubMenu addSubMenu(int groupId,int itemId,int order,CharSequence title):添加一个新的处于groupId组的子菜单;

注意:add()用于添加菜单,addSubMenu()用于添加子菜单;这些方法的重载区别只是:是否将子菜单、菜单项添加到指定菜单中,是否使用资源文件中的字符串资源来设置标题。

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

SubMenu setHeaderIcon(Drawable icon) 设置菜单的图标
SubMenu setHeaderIcon(int iconRes) 设置菜单的图标
SubMenu setHeaderTitle(int titleRes) 设置菜单的标题
SubMenu setHeaderTitle(CharSequence title) 设置菜单的标题
SubMenu setHeaderView(View view) 使用View来设置菜单头

 

 

 

 

添加菜单/菜单项的操作步骤:

  1.重写Activity的onCreateOptionsMenu(Menu menu),在该方法里调用Menu对象的方法来添加菜单项或子菜单;

  2.如果希望程序能响应菜单项的单击事件,重写Activity的onOptionsItemSelected(MenuItem item)方法即可;

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
 
    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
 
</LinearLayout>
 
代码实现==》
package com.example.mymenu;
 
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.EditText;
import android.widget.Toast;
 
public class MainActivity extends Activity
{
    // 定义字体大小菜单项的标识
     final int font_10 = 0x111;
     final int font_12 = 0x112;
     final int font_14 = 0x113;
     final int font_16 = 0x114;
     final int font_18 = 0x115;
     // 定义普通菜单的标识
     final int plain_item = 0x11b;
     // 定义字体颜色菜单项的标识
     final int font_red = 0x116;
     final int font_blue = 0x117;
     final int font_green = 0x118;
     EditText edit;
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
         edit = (EditText) this.findViewById(R.id.edit);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
         SubMenu fontMeun = menu.addSubMenu("字体大小");
         // 设置菜单图标
         fontMeun.setIcon(R.drawable.eighteen);
         // 设置菜单头图标
         fontMeun.setHeaderIcon(R.drawable.eighteen);
         // 设置菜单的标题
         fontMeun.setHeaderTitle("请选择字体大小");
         fontMeun.add(0, font_10, 0, "10");
         fontMeun.add(0, font_12, 0, "12");
         fontMeun.add(0, font_14, 0, "14");
         fontMeun.add(0, font_16, 0, "16");
         fontMeun.add(0, font_18, 0, "18");
         
         // 向Menu添加菜单项
         menu.add(0, plain_item, 0, "普通菜单项");
         
         SubMenu colorMenu = menu.addSubMenu("字体颜色");
         // 设置菜单图标
         colorMenu.setIcon(R.drawable.three);
         // 设置菜单头图标
         colorMenu.setHeaderIcon(R.drawable.three);
         // 设置菜单的标题
         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(MenuItem item)
    {
        switch (item.getItemId())
        {
        case font_10:
            edit.setTextSize(10 * 2);
            break;
        case font_12:
            edit.setTextSize(12 * 2);
            break;
        case font_14:
            edit.setTextSize(14 * 2);
            break;
        case font_16:
            edit.setTextSize(16 * 2);
            break;
        case font_18:
            edit.setTextSize(18 * 2);
            break;
 
        case font_red:
            edit.setTextColor(Color.RED);
            break;
        case font_blue:
            edit.setTextColor(Color.BLUE);
            break;
        case font_green:
            edit.setTextColor(Color.GREEN);
            break;
 
        case plain_item:
            Toast.makeText(MainActivity.this, "单击了普通菜单项", Toast.LENGTH_LONG).show();
            break;
        }
        return true;
    }
 
}

注意:程序中需要在onOptionsItemSelected(MenuItem item)中判断那个菜单项被选择了,因此在添加菜单时,需要为每个菜单添加ID.

运行效果:

                     

 

  

使用监听器监听菜单事件

除了重写onOptionsItemSelected(MenuItem item)可以响应菜单项被选择,同时支持通过为菜单项添加setOnMenuItemClickListener监听器监听菜单事件。

通过事件的处理方式,无须为每个菜单项添加ID.

使用方式如下图:

....

注意:建议采用重写onOptionsItemSelected(MenuItem item)方式实现菜单的事件处理.

 

创建复现菜单项和单选菜单项

如果需要创建的菜单项是单选菜单项或多选菜单项,则可调用MenuItem如下方法:

setCheckable(boolean checkable) 设置菜单项是否可以被勾选,调用该方法后的菜单项默认是多选菜单项
segGroupCheckable(int group,boolean checkable,boolean exclusive) 如果希望一组菜单项里的菜单项都设为可勾选的菜单项,则调用该方法;——设置group组里的所有菜单项是否可勾选,如果将exclusive设为true,那么其将是一组单选菜单项;
setAlphabeticShortcut(char aplhaChar) 设置字母快捷键
setNumericShortcut(char numericChar) 设置数字快捷键
setShortcut(char numericChar,char aplhaChar) 同时设置字母和数组快捷键

 

 

 

 

 

 

 

注意:

可勾选菜单的菜单必须由程序代码控制

实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
 
    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
 
</LinearLayout>
 
代码实现==》
package com.example.mycheckmenu;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.EditText;
 
public class MainActivity extends Activity
{
    final int MALE = 0x111;
    final int FEMALE = 0x112;
    final int RED = 0x113;
    final int GREEN = 0x114;
    final int BLUE = 0x115;
    MenuItem[] Items = new MenuItem[3];
    String[] ColorsName = new String[] { "红色", "绿色", "蓝色" };
    EditText edit;
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        edit = (EditText) this.findViewById(R.id.edit);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        SubMenu m = menu.addSubMenu("性别:");
        // 设置菜单图片
        m.setIcon(R.drawable.eight);
        // 设置菜单头的图标
        m.setHeaderIcon(R.drawable.eight);
        m.setHeaderTitle("请选择性别");
        m.addSubMenu(0, MALE, 0, "男");
        m.addSubMenu(0, FEMALE, 0, "女");
        // 设置m菜单内0组菜单项为单选菜单项
        m.setGroupCheckable(0, true, true);
 
        // 向m菜单中添加子菜单
        SubMenu sub = m.addSubMenu("颜色");
        sub.setIcon(R.drawable.sl);
        // 设置菜单头的图标
        sub.setHeaderIcon(R.drawable.sl);
        sub.setHeaderTitle("请选择颜色");
        // 添加菜单项,并设置为可勾选的菜单项
        Items[0] = sub.add(0, RED, 0, ColorsName[0]).setCheckable(true);
        Items[1] = sub.add(0, GREEN, 0, ColorsName[1]).setCheckable(true);
        Items[2] = sub.add(0, BLUE, 0, ColorsName[2]).setCheckable(true);
        // 设置快捷键
        Items[2].setAlphabeticShortcut('A');
        return super.onCreateOptionsMenu(menu);
    }
 
    // 菜单项被单击后回调方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
        case MALE:
            edit.setText("选择了性别为:男");
            item.setChecked(true);// 必须通过代码更改勾选状态
            break;
        case FEMALE:
            edit.setText("选择了性别为:女");
            item.setChecked(true);// 必须通过代码更改勾选状态
            break;
        case RED:
        case GREEN:
        case BLUE:
            setColor(item);
            break;
        }
        return super.onOptionsItemSelected(item);
    }
 
    private void setColor(MenuItem item)
    {
        if (item.isChecked())
        {
            item.setChecked(false);
        } else
        {
            item.setChecked(true);
        }
        StringBuffer buf = new StringBuffer();
        buf.append("选择的颜色有:");
        for (int i = 0; i < Items.length; i++)
        {
            if (Items[i].isChecked())
            {
                buf.append(ColorsName[i]);
                buf.append("、");
            }
        }
        edit.setText(buf);
    }
}

运行效果:

            

 

设置与菜单项关联的Activity

设置与菜单项关联的Activity——即,应用程序单击某个菜单项时启动Activity。

对于此种需求,只需要处理MenuItem的setIntent(Intent intent)方法即可——该方法把该菜单项与指定的intent关联到一起,当用户单击该菜单项时,该Intent所代表的组件将会被启动。

实例:

注意:新添加的Activity,需要在AndroidMainfext.xml添加定义。

 

上下文菜单

 android用ContextMeun来代表上下文菜单,为android应用开发上下文菜单与开发选项菜单的方法基本相似,ContextMenu继承Menu,因此程序可使用相同的方法为其添加菜单项。

开发上下文菜单与开发选项菜单的区别:

  上下文菜单不是重写onCreateOptionsMenu(Menu menu)方法,而是重写onCreateContextMenu(ContextMenu menu,View view,ContextMenu.ContextMenuInfo menuInfo)方法——其中view参数代表触发上下文菜单的组件。

开发上下文菜单的步骤如下:

  1.重写Activity的onCreateContextMenu(ContextMenu menu,View view,ContextMenu.ContextMenuInfo menuInfo)方法;

  2.调用Activity的registerForContextMenu(View view)方法为组件注册上下文菜单;

  3.如果希望程序可以为菜单提供响应,可重写onContextItemSelected(MenuItem mi)方法,或为指定菜单绑定事件监听器;

ContextMenu常用方法如下:

ContextMenu setHeaderIcon(Drawable icon) 为上下文菜单设置图标
ContextMenu setHeaderIcon(int iconRes) 为上下文菜单设置图标
ContextMenu setHeaderTitle(int titleRes) 为上下文菜单设置标题

 

 

 

注意:android中提供了两种创建菜单的方式,一种是通过java代码创建,一种是使用XML资源文件定义。

     一般建议使用XML资源文件定义方式创建菜单。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
 
    <TextView
        android:id="@+id/tvContent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="110110110110" />
 
</LinearLayout>
 
代码实现==》
package com.example.mycontextmenu;
 
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity
{
    final int Menu1 = 0x111;
    final int Menu2 = 0x112;
    final int Menu3 = 0x113;
    TextView TvContent;
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        TvContent = (TextView) this.findViewById(R.id.tvContent);
        // 为文本框注册上下文菜单
        registerForContextMenu(TvContent);
    }
 
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
    {
        menu.addSubMenu(0, Menu1, 0, "红色");
        menu.addSubMenu(0, Menu2, 0, "绿色");
        menu.addSubMenu(0, Menu3, 0, "蓝色");
        // 设置菜单头的图标
        menu.setGroupCheckable(0, true, true);
        menu.setHeaderIcon(R.drawable.three);
        menu.setHeaderTitle("请选择颜色");
 
        super.onCreateContextMenu(menu, v, menuInfo);
    }
 
    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
        case Menu1:
            item.setChecked(true);
            TvContent.setBackgroundColor(Color.RED);
            break;
        case Menu2:
            item.setChecked(true);
            TvContent.setBackgroundColor(Color.GREEN);
            break;
        case Menu3:
            item.setChecked(true);
            TvContent.setBackgroundColor(Color.BLUE);
            break;
        }
        return super.onContextItemSelected(item);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}

运行效果:

长按“110110110110”

 

posted on   sunwugang  阅读(328)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示