安卓常见的界面交互菜单


    (1)常用的菜单:上下文菜单(contextmenu), 设项菜单(optionmenu),子菜单(submenu)..

  1. 选项菜单:最常规的菜单,android中把它叫做option menu ,一般点击设备的menu键来触发;
  2. 子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。
  3. 上下文菜单:android中长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单
  4. 图标菜单:这个比较简单,就是带icon的菜单项,需要注意的是子菜单项、上下文菜单项、扩展菜单项均无法显示图标
  5. 选择菜单(alternative menu):用的比较少,以后单独介绍,本文先跳过
  6. 扩展菜单:选项菜单最多只能显示6个菜单项,超过6个时,第6个菜单项会被系统替换为一个叫“更多”的子菜单,原来显示不下的菜单项都作为“更多”菜单的子菜单项

    (2)activity中代码手动的添加菜单

       1 菜单项

         需要定义好 菜单项(采用的是Menu.FIRST+N来标识一个菜单项) ,然后在activity中 oncreateoptionmenu onOptionsitemselected 方法,其他看需求:实例代码如下(PS更好的处理方式,应该是用资源文件来创建菜单)

    public boolean onCreateOptionsMenu(Menu menu) {
            /*
             * 
             * add()方法的四个参数,依次是:
             * 1、组别,如果不分组的话就写Menu.NONE,
             * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
             * 3、顺序,那个菜单现在在前面由这个参数的大小
             * 4、文本,菜单的显示文本
             */
            menu.add(1, Menu.FIRST + 1, 2, "删除").setIcon( android.R.drawable.ic_menu_delete);
            // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以
            // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的
            menu.add(1, Menu.FIRST + 2, 2, "保存").setIcon(android.R.drawable.ic_menu_edit);
            menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(android.R.drawable.ic_menu_help);
            menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon( android.R.drawable.ic_menu_add);
            menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon( android.R.drawable.ic_menu_info_details);
            menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(android.R.drawable.ic_menu_send);
            return true;

        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {

            case Menu.FIRST + 1:

                Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show();

                break;

            case Menu.FIRST + 2:
                Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show();
                break;

            case Menu.FIRST + 3:
                Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show();
                break;

            case Menu.FIRST + 4:
                Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show();
                break;

            case Menu.FIRST + 5:
                Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show();
                break;

            case Menu.FIRST + 6:
                Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show();
                break;

            }

            return false;

        }

        @Override
        public void onOptionsMenuClosed(Menu menu) {
            Toast.makeText(this, "选项菜单关闭了", Toast.LENGTH_LONG).show();
        }

        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            Toast.makeText(this,
                    "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单",
                    Toast.LENGTH_LONG).show();
            // 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用
            return true;

        }
        /*

      (2)上下文菜单

            由于上下文菜单一般需要注册到视图的交互控件(PS 需要长按 被注册的控件才会出来),一般 则用户registerForContextMenu来注册,然后重新activity的onCreateContextMenu,和onContextMenuItemSelected()方法,其他看需求

//注册上下文菜单
        View view = findViewById(R.id.textView1);
        registerForContextMenu(view);

 

  public void onCreateContextMenu(ContextMenu menu, View v,
	    		ContextMenuInfo menuInfo) {
	    	// TODO Auto-generated method stub
//	    	super.onCreateContextMenu(menu, v, menuInfo);
	    	
	    	menu.add(Menu.NONE,Menu.FIRST,0,"菜单一").setIcon(R.drawable.ic_launcher);
	    	menu.add(Menu.NONE,Menu.FIRST+1,1,"菜单2").setIcon(R.drawable.ic_launcher);
	    	menu.add(Menu.NONE,Menu.FIRST+2,2,"菜单3").setIcon(R.drawable.ic_launcher);
	    	menu.add(Menu.NONE,Menu.FIRST+3,3,"菜单4").setIcon(R.drawable.ic_launcher);

	    }
	    @Override

	    public boolean onContextItemSelected(MenuItem item) {
	    	// TODO Auto-generated method stub
//	    	return super.onContextItemSelected(item);
	    	switch( item.getItemId()){
	    	    case Menu.FIRST:
	    	    	Toast.makeText(this, "你点击了菜单YI1", Toast.LENGTH_LONG).show();
	    		break;
	    	    case Menu.FIRST+1:
	    	    	Toast.makeText(this, "你点击了菜单2", Toast.LENGTH_LONG).show();
	    		break;
	    	    case Menu.FIRST+2:
	    	    	Toast.makeText(this, "你点击了菜3", Toast.LENGTH_LONG).show();
	    		break;
	    	    case Menu.FIRST+3:
	    	    	Toast.makeText(this, "你点击了菜单4", Toast.LENGTH_LONG).show();
	    		break;
	    	}
	  
	    	return true;
	    }
}

  (3)子菜单

           SubMenu 其实是在以上两种的菜单扩充: 如果是扩充选项菜单,则在oncreateoptionmenu 中调用 menu.addsubmenu()添加一个子菜单项,并返回该菜单项实例A,这样就可以将菜单项往A添加就行了,同类如果是扩充上下文菜单,同样的操作(ps 子菜单里面的菜单项没有不能设置icon的)实例代码

	     @Override
	    public boolean onCreateOptionsMenu(Menu menu) {
	    	// TODO Auto-generated method stub
	    	 SubMenu file =  menu.addSubMenu("文件").setIcon(R.drawable.ic_launcher);
	    	 SubMenu operate = menu.addSubMenu("编辑").setIcon(R.drawable.ic_launcher);
	    	 menu.add(Menu.NONE,Menu.FIRST+3,0,"其他");
	    	 //子菜单添加菜单项 子菜单没有图标
	    	 file.add(Menu.NONE,Menu.FIRST,0,"打开");
	    	 file.add(Menu.NONE,Menu.FIRST+1,0,"保存");
	    	 operate.add(Menu.NONE,Menu.FIRST+2,0,"帮助");
	    	 return true;
//	    	return super.onCreateOptionsMenu(menu);
	    }

	    @Override
	    public void onCreateContextMenu(ContextMenu menu, View v,
	    		ContextMenuInfo menuInfo) {
	    	// TODO Auto-generated method stub
//	    	super.onCreateContextMenu(menu, v, menuInfo);
	    	
	    	menu.add(Menu.NONE,Menu.FIRST,0,"菜单一").setIcon(R.drawable.ic_launcher);
	    	menu.add(Menu.NONE,Menu.FIRST+1,1,"菜单2").setIcon(R.drawable.ic_launcher);
	    	menu.add(Menu.NONE,Menu.FIRST+2,2,"菜单3").setIcon(R.drawable.ic_launcher);
	    	menu.add(Menu.NONE,Menu.FIRST+3,3,"菜单4").setIcon(R.drawable.ic_launcher);
	    	SubMenu file = menu.addSubMenu("文件");
	    	file.add(Menu.NONE,Menu.FIRST+4,4,"菜单5");

	    }

  

 

 

2016-03-27

 

posted on 2016-03-27 18:29  聚人生  阅读(368)  评论(0)    收藏  举报