菜单_菜单设计 - CSDN
  • Java:菜单(Menu)

    千次阅读 2019-04-27 19:02:50
    菜单是图形用户界面的重要组成部分,它通常有两种使用方式:窗口菜单和快捷菜单。下面介绍窗口菜单的创建。窗口菜单是由菜单条(MenmBar)、菜单(Memu)、菜单项(Menltem)和复选菜单项CeckoMonultem等组成的。菜单放在...

    菜单是图形用户界面的重要组成部分,它通常有两种使用方式:窗口菜单和快捷菜单。下面介绍窗口菜单的创建。
    窗口菜单是由菜单条(MenmBar)、 菜单(Memu)、菜单项(Menltem)和复选菜单项CeckoMonultem等组成的。菜单放在菜单条里,菜单项放在菜单里。

    (1)菜单条(MenBar)。

    Java.awt包中的MenuBar类是负责创建菜单条的,即MenuBar类的一个实例就是一个菜单条。菜单条只能被添加到作为Frame对象中,整个菜单树的根基。
    Frame类有一个将菜单条放置到窗口中的方法:
    setMenuBar (MenuBar bar)

    该方法将菜单条添加到窗口的顶端,需要注意的是,只能向窗口添加一个菜单条。

    例如:
    MenuBar MenuBar1 = new MenuBar()                   //创建菜单条
    setMenuBar (MenuBar1)                                              //添加创建菜单条到Frame中

    (2)菜单(Menu)。

    Menu类负责创建菜单,即Menu类的一个实例就是一个菜单。 无法直接将菜单添加到容器的某位置,也无法使用布局管理器对其加以控制。菜单只能被添加到“菜单容器”菜单条(MenuBar) 中。
    例如:
    Menu Menu1=new Menu("文件")                                  //创建菜单
    menubar . add (Menu1)                                                //添加到菜单条中

    (3)菜单项(Menultem)。

    MenuItem类是负责创建菜单项的,即MenuItem类的一个实例就是一个菜单项。菜单项必须添加到菜单中。MenuItem是整个“菜单树”中的“叶子节点”。Menultem对象可以添加ActionListener,使其能完成相应的操作,在后面的章节中会学习相关知识。
    例如:
    MenuItem item1=new MenuItem ("新建")                     //创建菜单项
    menul . add (item1)                                                      //添加到菜单中

    代码如下:

    import java.awt.*;
    import java.awt.event.*;
    public class MenuDemo {
        Frame fr = new Frame("MenuDemo");
        MenuBar mb = new MenuBar();//以下生成菜单组件对象
        Menu m1 = new Menu("文件");
        MenuItem open = new MenuItem("打开");
        MenuItem close = new MenuItem("关闭");
        MenuItem exit = new MenuItem("退出");

            MenuDemo()
            {
                fr.setSize(350,200);
                m1.add(open);                                                              //将菜单项加入到菜单中
                m1.add(close);
                m1.addSeparator();                                                      //将分隔条加入到菜单中
                m1.add(exit);
                mb.add(m1);                                                                 //将菜单加入到菜单条中
                
                fr.setMenuBar(mb);                                                      //显示菜单条
                fr.setVisible(true);
            }
            public static void main(String args[]) {
                new MenuDemo();
            }
    }
    运行结果:

     说明:
    (1)当希望在菜单项之间添加一条横向的分隔线,把菜单项分为几组时,可以添加分隔线。可以使用下面的方法:
    menu1.addSeparator ()或者menul .add("-")


    (2)复选菜单项与复选框一样有“选中”和“未选中”两种状态,处于“选中”状态的检测菜单项前面有一个小对号。
    CheckboxMenultem Checkbox=new CheckboxMenultem(" ") ;//创建检测菜单项

    menul. add (Checkbox) ;//添加到菜单中

     

    展开全文
  • C语言操作界面菜单思考

    万次阅读 2017-06-26 00:04:51
    C语言中,制作菜单操作界面是很常见的,一般都是通过scanf("%d",&i) 与switch(i)搭配来使用,这种方法很基础,我近来发现另外一种比较不错的方法,容错处理也有,可拓展性也高:#define BUFFERSIZE 256 enum login_...
    C语言中,制作菜单操作界面是很常见的,一般都是通过scanf("%d",&i) 与switch(i)搭配来使用,这种方法很基础,我近来发现另外一种比较不错的方法,容错处理也有,可拓展性也高:
    #define BUFFERSIZE 256
    enum login_register_status {_f_main_, _login_id_, _login_passwd_, _udpport_, _register_name_, _register_passwd_};
    static struct
    {
    	enum login_register_status status;
    	int buf_size;                        //从标准输入中获取的字节个数
    	int display;                         //根据需要,可以选择添加这个变量,控制显示设计
    	char *buf;                           //从标准输入获取的字节存放的位置,同buf_size一起使用
    }f_menu;
    
    static void init_f_menu()             //初始化菜单
    {
    	f_menu.status = _f_main_;
    	f_menu.display = 1;
    	f_menu.buf_size = BUFFERSIZE;             //一次从标准输入获取的字节共个数
    	f_menu.buf = malloc(BUFFERSIZE);
    }
    
    
    //通过这个枚举形式,本质上主界面和子界面是同一等级
    static void fun_f_menu()
    {
    	if(_f_main_ == f_menu.status)
    		printf("1.登录  2.注册  3.退出\n");	         //主界面
    	else if(_login_id_ == f_menu.status)
    		printf("请输入ID:\n"); 						//以下5个分级子界面,本质上和主界面同一等级
    	else if(_login_passwd_ == f_menu.status)
    		printf("请输入密码:\n");            
    	else if(_udpport_ == f_menu.status)
    		printf("请输入监听的UDP端口\n");
    	else if(_register_name_ == f_menu.status)
    		printf("请输入姓名:\n");
    	else if(_register_passwd_ == f_menu.status)
    		printf("请输入密码:\n");
    }
    
    static void do_f_menu()
    {
    	int nret;
    	scanf("%s", f_menu.buf);
    	//主界面的操作选项,通过从buf中获取的不同的数值,设置不同的f_menu.status,进行不同的操作
    	if(f_menu.status == _f_main_)
    	{
    		int num;
    		sscanf(f_menu.buf, "%d", &num);
    		if(1 == num)
    			f_menu.status = _login_id_;
    		else if(2 == num)
    		{
    			f_menu.status = _register_name_;
    		}
    		else if(3 == num)
    		{
    			exit(1);
    		}
    		else
    		{
    			printf("输入错误\n");
    			f_menu.status = _f_main_;
    		}
    	}
    	//根据不同status,来选择不同界面操作
    	else if(f_menu.status == _login_id_)     
    	{
    		/*   *** */
    		f_menu.status = ***       //下一个界面
    	}
    	else if(f_menu.status == _login_passwd_)     
    	{
    		/*   *** */
    		f_menu.status = ***       //下一个界面
    	}
    	else if(f_menu.status == _udpport_)      
    	{
    		/*   *** */
    		f_menu.status = ***       //下一个界面
    	}
    	else if(f_menu.status == _register_name_)
    	{
    		/*   *** */
    		f_menu.status = ***       //下一个界面
    	}
    	else if(f_menu.status == _register_passwd_)
    	{
    		/*   *** */
    		f_menu.status = ***       //下一个界面
    	}
    }


    展开全文
  • c++入门练习--菜单

    千次阅读 2017-12-22 15:38:47
    main.cpp#include <iostream>void Menu(); //声明主菜单 int Out(); //声明小目录int main(){ Menu(); //主菜单 return 0; }//定义菜单 void Menu(){ bool opt = true; //是否循环的一个标志 while (opt == tr

    main.cpp

    /*
     * 简单菜单选项
     * 注:使用接收用户输入变量类型一定要是字符型,
     * 如果用整型接收输入的话,用户输入了一个字符,那么程序就会出错。
    */
    
    #include <iostream>
    
    void Menu();    //声明主菜单
    int Out();      //声明小目录
    
    int main(){
    
        Menu();     //主菜单
    
        return 0;
    }
    
    //定义主菜单
    void Menu(){
        bool opt = true;        //是否循环的一个标志
        while (opt == true) {
    
            //菜单列表
            std::cout << "\n\t\t*********\n";
            std::cout << "\t\t*1.新 建*\n";
            std::cout << "\t\t*2.打 开*\n";
            std::cout << "\t\t*3.查 看*\n";
            std::cout << "\t\t*4.帮 助*\n";
            std::cout << "\t\t*5.退 出*\n";
            std::cout << "\t\t*********\n";
    
            //接收输入选择
            std::cout << "\t\t选择:";
            char x;
            std::cin >> x;
    
            //判断用户的选择
            switch (x) {
            case '1':
                std::cout << "\n\t\t你选择了1\n";
                opt = Out();        //小目录
                break;
            case '2':
                std::cout << "\n\t\t你选择了2\n";
                opt = Out();        //小目录
                break;
            case '3':
                std::cout << "\n\t\t你选择了3\n";
                opt = Out();        //小目录
                break;
            case '4':
                std::cout << "\n\t\t你选择了4\n";
                opt = Out();        //小目录
                break;
            case '5':
                std::cout << "\n\t\t你选择了5\n";
                opt = false;        //把标志位为假,就退出了循环
                break;
            default:
                std::cout << "\n\t\t输入非法,请重新选择!\n";
    
                break;
            }
    
        }
    
        std::cout << "\n\t\t菜单已退出!\n";
    }
    
    //定义小目录
    int Out(){
    
        std::cout << "\n";
        std::cout << "\t\t************\n";
        std::cout << "\t\t*1.返回目录*\n";
        std::cout << "\t\t*2.退出程序*\n";
        std::cout << "\t\t************\n";
    
        std::cout << "\t\t选择:";
        char y;
        std::cin >> y;      //接受输入
        switch ( y ) {
        case '1':
            return true;
    
        case '2':
            return false;
    
        default:
            std::cout << "\t\t非法输入,已返回主目录!\n";
            return true;
            break;
        }
    }

    下载:
    http://download.csdn.net/download/qq551551/10169557

    展开全文
  • 前言:这周看到菜单部分,以前也对菜单有过使用,但并没有系统的对菜单进行梳理。这次借着这个机会,对菜单进行梳理。但只是很浅显的系统讲解,即对菜单的种类及各种用法作了一些讲述,并没有对如何使用自定义的菜单...

    前言:这周看到菜单部分,以前也对菜单有过使用,但并没有系统的对菜单进行梳理。这次借着这个机会,对菜单进行梳理。但只是很浅显的系统讲解,即对菜单的种类及各种用法作了一些讲述,并没有对如何使用自定义的菜单布局做讲述,等下次有机会再次遇到的时候再补充吧,一下搞太多,有点吃不消,很累的。

     

    系列文章:

    1、《Menu详解(一):代码实现系统菜单及子菜单》

    2、《Menu详解(二):利用XML生成菜单和子菜单》

    3、《Menu详解(三):使用上下文菜单》

     

    一、基础知识

     

    1、菜单分类

    我认为菜单只有两类,一个是系统菜单,一个是上下文菜单

     

    • 系统菜单:指按下menu键,所弹出的菜单。
    • 上下文菜单:长按某一项,所弹出的菜单。

     

    对于子菜单,我不觉得应该加入到上面的类别中,因为它并不是一种特殊的菜单种类,而仅仅是菜单的一种嵌套应用而已。

    这个系列博客会逐个讲解这两个菜单的分类,本篇文章先从系统菜单开始。

    2、菜单的基本知识

    在代码中,我们会经常用到的几个知识点,先做下讲解。

    菜单组(group):菜单组,是指包含几个菜单项的一个组合。之 所以划分菜单组,是方便我们对该组菜单中的项,做统一操作,比如,该菜单组里的所有项全部隐藏,全部不可用,等。

    菜单项ID(itemID):此ID在一个Activity中,不可重复,因为他唯一标识了一个菜单项。注意,我这里说的是一个Activity页面,而不是一个菜单页面!!!!

    这里先简单的对这两个概念说一下,初学者可能不大理解,没关系,下面举例说明。

    二、系统菜单的基本实现

    效果图:

    注意菜单项排序

    我们先看下代码:

     

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
        	
            int groupId=1;
            menu.add(groupId, 1, 1, "menu1_1");
            menu.add(groupId, 2, 3, "menu1_2");
            
            int groupId2=2;
            menu.add(groupId2, 3, 2, "menu2_1");
            menu.add(groupId2, 4, 4, "menu2_2");
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
        	
        	//提示一下,当前做了什么操作
        	Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
           
        	//根据ItemId来判断当前点击的菜单项是哪一个,从而进行操作
        	int id = item.getItemId();
            if (id == 1) {
            	TextView tv=(TextView)findViewById(R.id.helloworld);
            	tv.setText("menu1_1 clicked");
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    如果大家仔细观察每次新建项目时就会发现,onCreateOptionsMenu()和onOptionsItemSelected()是在项目新建的时候,系统会自己为我们添加的代码。

     

    • onCreateOptionsMenu():当用户按下设置键时,系统会调用这个方法,其中的Menu参数就是我们要显示的菜单;
    • onOptionsItemSelected():当用户选择一个菜单项时,系统会转到这个方法中进行处理,用户只需要识别出当前用户按下的是哪个菜单,然后做处理就行了,下面具体讲解。

     

     

    1、先看onCreateOptionsMenu():

     

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	
        int groupId=1;
        menu.add(groupId, 1, 1, "menu1_1");
        menu.add(groupId, 2, 3, "menu1_2");
        
        int groupId2=2;
        menu.add(groupId2, 3, 2, "menu2_1");
        menu.add(groupId2, 4, 4, "menu2_2");
        return true;
    }

    这里有个add()函数,它的原型是这样的:

     

     

    public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title)

    其中:

     

     

    • groupId:组ID
    • itemId:菜单项ID,我们上面讲了,整个activity中,这个ID值必须是唯一的。先记住即可,后面我们会讲为什么要唯一。
    • order:是在一个菜单中的排序顺序,一个菜单的排序顺序会根据这个值,由小到大排列菜单项。所以,仔细看上面的排序方式,我故意把排序顺序改成了,1,3,2,4;但界面中菜单的排序应该是按1,2,3,4 这样排序的:(从效果图可以看到,菜单的排序是按order的大小排列的!)

    在上面的代码中,我们讲菜单分成了两个组,这个组的概念仅仅在代码中有用,在效果图中是根本看不出来的,因为在代码中,我们可以对组直接操作。这个后面会看到。

    2、再看看onOptionsItemSelected()

     

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	
    	//提示一下,当前做了什么操作
    	Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
       
    	//根据ItemId来判断当前点击的菜单项是哪一个,从而进行操作
    	int id = item.getItemId();
        if (id == 1) {
        	TextView tv=(TextView)findViewById(R.id.helloworld);
        	tv.setText("menu1_1 clicked");
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    这个实现很好理解,先用一个Toast提示当前点击的Item的名称;

     

    然后根据itemId进行判断,当id等于1时,把hello word改成menu1_1 clicked;
    由此可以看出,我们对某个menuItem进行响应,是根据ItemId来识别的,所以ItemId必须唯一!

    三、代码操作菜单组

    为了让大家深入理解组的概念,这里有三个函数都是对组进行操作的:

     

     * Menu::setGroupVisible():将指定组的菜单设置为可见或不可见
     * Menu::setGroupEnabled():将指定组的菜单设置为可用或不可用
     * Menu::setGroupCheckable():将指定组的菜单设置为单选或多选

    这三个的原原型分别如下:

     

     

    public abstract void setGroupVisible (int group, boolean visible)

    Added in API level 1

    Show or hide all menu items that are in the given group.

    Parameters

    group The group of items to operate on.
    visible If true the items are visible, else they are hidden.

    public abstract void setGroupEnabled (int group, boolean enabled)

    Added in API level 1

    Enable or disable all menu items that are in the given group.

    Parameters

    group The group of items to operate on.
    enabled If true the items will be enabled, else they will be disabled.

    public abstract void setGroupCheckable (int group, boolean checkable, boolean exclusive)

    Added in API level 1

    Control whether a particular group of items can show a check mark. This is similar to calling setCheckable(boolean) on all of the menu items with the given group identifier, but in addition you can control whether this group contains a mutually-exclusive set items. This should be called after the items of the group have been added to the menu.

    Parameters

    group The group of items to operate on.
    checkable Set to true to allow a check mark, false to disallow. The default is false.
    exclusive If set to true, only one item in this group can be checked at a time; checking an item will automatically uncheck all others in the group. If set to false, each item can be checked independently of the others.

    最后一个函数,我要特别说一下,setGroupCheckable()的第三个参数设为True或False,这是单选还是多选的开关,如果设为True,只能单选;设为False,为多选。
    下面是个例子:

     

     

    public class MainActivity extends Activity {
    
    	private Menu mMenu;
    	private int groupId_1=1;
    	private int groupId_2=2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		
    		mMenu=menu;
    		
    		//添加第一组菜单
    	    menu.add(groupId_1, 1, 0, "1——将第二组按钮不可见");
    	    menu.add(groupId_1, 2, 0, "1——将第二组按钮可见");
    	    menu.add(groupId_1, 3, 0, "1——将第二组按钮不可用");
    	    menu.add(groupId_1, 4, 0, "1——将第二组按钮可用");
    	    
    	    //添加第二组菜单 
    	    menu.add(groupId_2, 5, 5, "2——将第一组变成checkable");
    	    menu.add(groupId_2, 6, 6, "2——去掉第一组的checkable");
    	
    	    return true;
    	}
    
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		
    		//提示一下,当前做了什么操作
    		Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
    		
    		switch (item.getItemId()) {
    		case 1:
    			mMenu.setGroupVisible(groupId_2, false);
    			break;
    		case 2:
    			mMenu.setGroupVisible(groupId_2, true);		
    			break;
    		case 3:
    			mMenu.setGroupEnabled(groupId_2, false);
    			break;
    		case 4:
    			mMenu.setGroupEnabled(groupId_2, true);
    			break;
    		case 5:
    			mMenu.setGroupCheckable(groupId_1, true, false);
    			//最下面有最后一个参数true和false的区别,简单来说,设为False,可多选,设为True,只能单选
    			break;
    		case 6:
    			mMenu.setGroupCheckable(groupId_1, false, false);
    			break;
    	
    		default:
    			break;
    		}
    	    return super.onOptionsItemSelected(item);
    	}
    }
    

    这段代码很好理解,在onCreateOptionsMenu()中新建两个组;
    然后在onOptionsItemSelected()的响应代码中,对每个代码进行响应,下面截两个图吧,内容太多,两个效果:case 5和case 6,对比一下:

     

                                          case 5                                                     case 6

      

    四、代码添加子菜单

    在这段,我们将看到两个功能:如何添加子菜单,如何给菜单项添加图标(Icon)

    效果图:

                                 最后一项为子菜单                              点击,弹出子菜单

      

    先看全部代码,再逐步讲解:

     

    public class MainActivity extends Activity {
    
    	private Menu mMenu;
    	private int groupId_1=1;
    	private int groupId_2=2;
    	private int groupId_3=3;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		
    		mMenu=menu;
    		
    		//添加第一组菜单
    	    menu.add(groupId_1, 1, 1, "1——将第二组按钮不可见");
    	    menu.add(groupId_1, 2, 2, "1——将第二组按钮可见");
    	    menu.add(groupId_1, 3, 3, "1——将第二组按钮不可用");
    	    menu.add(groupId_1, 4, 4, "1——将第二组按钮可用");
    	    
    	    //添加第二组菜单 
    	    menu.add(groupId_2, 5, 5, "2——将第一组变成checkable");
    	    //给一个菜单项添加Icon
    	    MenuItem item=menu.add(groupId_2, 6, 6, "2——去掉第一组的checkable");
    	    item.setIcon(R.drawable.ic_launcher);
    	    
    	    //添加子菜单
    	    SubMenu subMenu=menu.addSubMenu(groupId_2, 7, 7, "子菜单---SubMenu");
            subMenu.setIcon(R.drawable.ic_launcher);//给SubMenu设置Icon
            
            //给SubMenu添加菜单项
            subMenu.add(groupId_3, 9, 1,"submenu_1");
            subMenu.add(groupId_3, 8, 2,"submenu_2");
            
            //给子菜单的菜单项添加Icon图标
            MenuItem subItem=subMenu.add(groupId_3, 11, 3,"submenu_3");
            subItem.setIcon(R.drawable.ic_launcher);
    	
    	    return true;
    	}
    
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		
    		//提示一下,当前做了什么操作
    		Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
    		
    		switch (item.getItemId()) {
    		case 1:
    			mMenu.setGroupVisible(groupId_2, false);
    			break;
    		case 2:
    			mMenu.setGroupVisible(groupId_2, true);		
    			break;
    		//其它省略
    	
    		default:
    			break;
    		}
    	    return super.onOptionsItemSelected(item);
    	}
    	
    }

    1、onCreateOptionsMenu()部分

     

    看这段代码:

     

    //给一个菜单项添加Icon
    MenuItem item=menu.add(groupId_2, 6, 6, "2——去掉第一组的checkable");
    item.setIcon(R.drawable.ic_launcher);

    这是利用MenuItem::setIcon()函数,给菜单项添加一个Icon

     

     

     

     

     

     

    //添加子菜单
    SubMenu subMenu=menu.addSubMenu(groupId_2, 7, 7, "子菜单---SubMenu");
    subMenu.setIcon(R.drawable.ic_launcher);//给SubMenu设置Icon

    直接调用Menu::addSubMenu()来添加子菜单,同样它的参数包括groupId,ItemId,orderId;

     

    SubMenu的设置Icon的方法也是SetIcon();
     

    最后是给子菜单的菜单项添加Icon:

     

    //给子菜单的菜单项添加Icon图标
    MenuItem subItem=subMenu.add(groupId_3, 11, 3,"submenu_3");
    subItem.setIcon(R.drawable.ic_launcher);

    可见添加Icon的方法都是调用SetIcon()函数;

     

     

     

     

     

    注意:

    在上面这段代码中,有个特别需要注意的地方,就是无论是主菜单的菜单项,还是子菜单的菜单项,ItemId都必须是唯一的,因为我们在onOptionsItemSelected()中是以ItemId来判定当前用户点击的是哪一个Item,并对其分别操作的,所以如果两个菜单项的ItemId一样了,那么点击他们两个都会执行同一个操作。

    2、onOptionsItemSelected()

    这里没什么好讲的,与以往一样,也是通过ItemId来分离所有Item,并指定相关操作的。

    3、存在问题

    大家如果在4.0以下的手机上运行上面代码,应该不会出现什么问题,但在>=4.0版的手机上运行时,Icon无法显示。这是因为4.0以上的版本对接口进行了更改,这个问题的解决办法如下 :

    添加下面一个函数,并在onCreateOptionsMenu()开始处调用:setIconEnable(menu, true); 

     

    //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效  
    private void setIconEnable(Menu menu, boolean enable)  
    {  
        try   
        {  
            Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");  
            Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);  
            m.setAccessible(true);  
              
            //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)  
            m.invoke(menu, enable);  
              
        } catch (Exception e)   
        {  
            e.printStackTrace();  
        }  
    }  


    这个问题的解决办法参考文章:《 解决android4.0系统中菜单(Menu)添加Icon无效问题》

     

    五:OnMenuItemClickListener()---- Item点击监听器

    我们前面一直在说用户点击了某一个菜单项以后,在onOptionsItemSelected()函数中进行拦截,其实还有一种拦截方法,就是自定义监听函数,然后利用setOnMenuItemClickListener()设定。

    这涉及到两个问题:

     

    • 1、每一个监听函数仅针对一个item,所以如果使用自定义OnMenuItemClickListener监听函数,就要对每一个Item都要自定义一个,对于没有定义监听函数的Item,消息仍会派发到onOptionsItemSelected()中进行处理;
    • 2、对于设定了监听函数的Item,系统会在自定义的OnMenuItemClickListener函数中进行处理,即便在onOptionsItemSelected()中也写了处理函数,但系统是不会再进入onOptionsItemSelected()中点击消息的;

     

    下面,举例说明上面两个问题:

    全部代码:

     

    public class MainActivity extends Activity {
    
    	private int groupId_1=1;
    	private int groupId_2=2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		
            menu.add(groupId_1, 1, 1, "menu1_1").setOnMenuItemClickListener(listener);  
            menu.add(groupId_1, 2, 2, "menu1_2");  
                
            menu.add(groupId_2, 3, 3, "menu2_1");  
            menu.add(groupId_2, 4, 4, "menu2_2");  
            return true;  
    	}
    
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		
    		//提示一下,当前做了什么操作
    		
    		switch (item.getItemId()) {
    		case 1:
    			Toast.makeText(getApplicationContext(), "onOptionsItemSelected  response: "+item.getTitle(), Toast.LENGTH_SHORT).show();
    			break;
    		//其它省略
    		default:
    			Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
    			break;
    		}
    	    return super.onOptionsItemSelected(item);
    	}
    	
    	//自定义一个MenuItemClickListener监听函数
    	OnMenuItemClickListener listener =new OnMenuItemClickListener() {
    			
    			@Override
    			public boolean onMenuItemClick(MenuItem item) {
    				// TODO Auto-generated method stub
    				 Toast.makeText(getApplicationContext(),"listener  response:" + item.getTitle(), Toast.LENGTH_SHORT).show();
    				return false;
    			}
    		};
    	
    }
    

    在上面的代码中,我对第一个Item,不仅在OnMenuItemClickListener中添加处理,而且在onOptionsItemSelected中也做了提示处理,以便区别,系统到底在哪个里面进行处理。

     

    下面是操作结果截图:

                             点击第一个Item                                             点击除了第一个Item的其它菜单项

      

    从结果图中也可以看出,对于设定了OnMenuItemClickListener()监听函数的,就会在这个函数中进行处理;对于没有设定OnMenuItemClickListener()函数的,会在onOptionsItemSelected()中处理。

     

    好了,本文就到这了。

     

    我把上面所有用到的源码及效果图打包,供大家下载:

     

    源码下载地址:http://download.csdn.net/detail/harvic880925/7782589

    请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38657463  谢谢!

     

    如果你喜欢我的文章,你可能更喜欢我的公众号

    启舰杂谈

     

    展开全文
  • HTML5菜单栏特效

    万次阅读 2018-01-17 15:27:15
    利用CSS3技术可以实现各种各样的网页菜单,我们之前也在CSS3菜单栏目中分享了许多CSS3菜单。今天我们分享的这款是CSS3手风琴菜单菜单项在展开和收缩的时候菜单项会有弹性动画效果。每一层父级菜单有一个小三角,...
  • 前言:上篇,我们说了有关代码生成菜单和子菜单的方法,这里我们再讲讲有关利用XML生成菜单和子菜单的问题。 业精于勤,荒于嬉,行成于思,毁于随 (日拱一卒) 系列文章: 1、《Menu详解(一):代码实现...
  • Android推荐的三种基本菜单

    万次阅读 2018-03-15 09:41:38
    Google在开发者网站上关于Menu的API指南中为开发者推荐了三种基本的菜单:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和弹出菜单(PopupMenu)。下面分别给出相应的基本实现步骤。
  • Qt界面添加菜单,工具栏以及状态栏

    万次阅读 2016-08-28 23:22:29
    原文: ... ...MFC基本上就是单文档结构/多文档结构,以及基于对话框应用程序 ...而且这两种应用程序,都可以直接通过新建一个空的qmake应用程序menuToolbarStatusBar,再添加cpp,ui或qml,都能达到自己想要的要求 ...
  • 之前我向大家介绍了史上最简单的滑动菜单的实现方式,相信大家都还记得。如果忘记了其中的实现原理或者还没看过的朋友,请先去看一遍之前的文章 Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑...
  • Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭

    万次阅读 多人点赞 2016-08-10 19:50:29
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39257409,本文出自【张鸿洋的博客】上一篇博客带...的确,上一篇也承诺过,稍微修改上一篇的代码,实现QQ5.0侧滑菜单~~好了,下面就开始为大家展
  • 2)服务号可以申请自定义菜单; 3)使用QQ登录的公众号,可以升级为邮箱登录; 4)使用邮箱登录的公众号,可以修改登录邮箱; 5)编辑图文消息可选填作者; 6)群发消息可以同步到腾讯微博。 其中,大家议论...
  • 使用layui实现的左侧菜单栏以及动态操作tab项

    万次阅读 多人点赞 2018-07-10 16:48:08
    首先说一下左侧菜单栏:这是一个最基本的左侧菜单栏,实现的过程很简单,官方的说明文档就有,但是我在到入layer.js之后,直接复制这段官方代码到我的编辑器上时,发现页面是这样的:发现,绑定属性的菜单并没有下拉...
  • 距离写上一篇文章《自定义菜单的创建及菜单事件响应》整整过了两个月的时间,那时公众平台还没有开放view类型的菜单。在不久前,微信公众平台悄悄开放了view类型的菜单,却没有在首页发布任何通知,貌似微信团队很...
  • 人人客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示。 据说人人客户端的这个特效是从facebook客户端模仿来的,至于...
  • 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个朋友在评论中留言,希望我可以帮他将这个滑动菜单改成双向滑动的方式。当时也没想花太多时间,简单修改了一下就发给了他,结果没想到后来却有一...
  • Bootstrap 多级下拉菜单

    万次阅读 2018-05-24 21:52:52
    多级下拉菜单在很多时候,我们可能需要多级下拉菜单。在一个下拉菜单的某个菜单项中,再创建另一个下拉菜单,即可实现多级下拉菜单。只需为下拉菜单的任意 &lt;li&gt; 元素添加 .dropdown-submenu 的类,并...
  • Android 自定义控件打造史上最简单的侧滑菜单

    万次阅读 多人点赞 2016-08-10 19:50:40
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39185641 ,本文出自【张鸿洋的博客】侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup...
  • 经典DIV+CSS下拉菜单

    万次阅读 2018-07-27 18:57:32
    符合WEB标准的CSS下拉导航菜单布局及css下拉菜单模板   HTML代码如下 &lt;ul id="nav"&gt; &lt;li&gt;&lt;a href="###"&gt;div+css&lt;/a&gt; &...
  • Java菜单菜单条、菜单菜单项)

    万次阅读 2018-10-30 11:52:12
    有两种类型的菜单:下拉式菜单和弹出式菜单。本章只讨论下拉式菜单编程方法。菜单与JComboBox和JCheckBox不同,它们在界面中是一直可见的。菜单与JComboBox的相同之处是每次只可选择一个项目。在下拉式菜单或弹出式...
  • Excel多级下拉菜单联动自动匹配内容

    万次阅读 2017-01-10 13:35:01
    如,点击“市”下方的下拉菜单,有“成都、北京、杭州、上海”四个选项,选择杭州以后,在“区”下方单元格的就会相应的出现杭州的区。 操作说明: 1.首先选中表格中的基础数据,按键盘上的【Ctrl+G】,就会弹出...
1 2 3 4 5 ... 20
收藏数 1,184,020
精华内容 473,608
关键字:

菜单