android菜单学习笔记

来源:互联网 发布:linux gdb调试视频 编辑:程序博客网 时间:2024/05/18 21:39

 
选项菜单:最常规的菜单,android中把它叫做option menu
子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。
上下文菜单:android中长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单
图标菜单:这个比较简单,就是带icon的菜单项,需要注意的是子菜单项、上下文菜单项、扩展菜单项均无法显示图标。
选择菜单(alternative menu):用的比较少,以后单独介绍,本文先跳过(其实是我还没弄明白啦o(≧v≦)o~~)
扩展菜单:选项菜单最多只能显示6个菜单项,超过6个时,第6个菜单项会被系统替换为一个叫“更多”的子菜单,原来显示不下的菜单项都
为“更多”菜单的子菜单项。如下图作 
    
每个activity包含一个菜单,一个菜单又能包含多个菜单项和多个子菜单,子菜单其实也是菜单(因为它实现了Menu接口),因此子菜单也可以包含多个菜单项。OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了两个回调方法,用于创建菜单项和响应菜单项的点击
1,创建options menu  选项菜单
[java] view plaincopy
@Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        //为了兼容以后的版本  
        super.onCreateOptionsMenu(menu);  
          
        //多种方式添加菜单项  
          
        //menu.add("菜单项1");//1,直接指定标题,这个响应的时候我不知道怎么调用  
        //menu.add(R.string.menuitem2);//2,通过资源指定标题  
          
        menu.add(1, Menu.FIRST, 1, "菜单项1");//3,显式指定菜单项的组号,ID , 排序,标题  
        menu.add(1, Menu.FIRST+1, 2, "菜单项2");  
        menu.add(2, Menu.FIRST+2, 3, "菜单项3");  
        menu.add(2, Menu.FIRST+3, 4, "菜单项4");  
        menu.add(2, Menu.FIRST+4, 5, "菜单项5");  
        menu.add(2, Menu.FIRST+5, 6, "菜单项6");//多于6个将会被系统以更多字样替换  
        menu.add(2, Menu.FIRST+6, 7, "菜单项7");  
        menu.add(2, Menu.FIRST+7, 8, "菜单项8");  
[java] view plaincopy
return true;//如果希望现实菜单,返回true  
响应菜单项
使用的最多方法是重写activity类的 
onOptionsItemSelected(MenuItem)
回调方法,每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。
以下代码可作为使用onOptionsItemSelected方法响应菜单的模板来使用,这里为了方便起见将菜单ID硬编码在程序里,你可以使用常量或资源ID来使代码更健壮
[java] view plaincopy
@Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
          
        switch(item.getItemId()){  
        case 1:  
            //do something  
            Toast.makeText(this, "1", Toast.LENGTH_LONG).show();  
            break;  
        case 2:  
            Toast.makeText(this, "2", Toast.LENGTH_LONG).show();  
            break;  
        case 3:  
            Toast.makeText(this, "3", Toast.LENGTH_LONG).show();  
            break;  
        case 4:  
            Toast.makeText(this, "4", Toast.LENGTH_LONG).show();  
            break;  
        default:  
            return super.onOptionsItemSelected(item);  
        }  
          
        return true;  
    }  
使用监听器响应菜单项

虽然上边方法是推荐使用的方法,android还是提供了类似java swing的监听器方式来响应菜单。使用监听器的方式分为两步:


[java] view plaincopy
//第一步:为菜单项注册监听器  
menuItem.setOnMenuItemClickListener(new MyMenuItemClickListener());  
//第二步:创建监听器类  
class MyMenuItemClickListener implements OnMenuItemClickListener {  
    @Override  
    publicboolean onMenuItemClick(MenuItem item) {  
    switch(){  
    // do something here...  
    }  
         
    return true;    //finish handling  
    }  
}  

该方法先于onOptionsItemSelected执行。


[java] view plaincopy
<h1 style="font-family: verdana; "><a name="t4"></a>2,子菜单Sub Menu</h1><span style="font-family: verdana; ">Android支持子菜单,你可以通过addSubMenu</span><span style="font-family: verdana; ">(int groupId, int itemId, int order, int titleRes)方法非常方便的创建和响应子菜单。</span>  


[java] view plaincopy
@Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        //为了兼容以后的版本  
        super.onCreateOptionsMenu(menu);  
                  
        //添加子菜单  
        //一个菜单可以有多个子菜单  
                          menu.addSubMenu(1, Menu.FIRST, 1, "系统设置" );  
        SubMenu subMenu = menu.addSubMenu(1, Menu.FIRST+1, 2, "网络设置" );//子菜单支持图标  
        subMenu.setIcon(R.drawable.ic_launcher);  
          
        MenuItem menuItem = subMenu.add(2, Menu.FIRST+2, Menu.NONE, "菜单项1");//子菜单项不支持显示图标  
        //menuItem.setIcon(R.drawable.ic_launcher);  
        subMenu.add(2, Menu.FIRST+3, Menu.NONE, "菜单项2");  
        subMenu.add(2, Menu.FIRST+4, Menu.NONE, "菜单项3");  
        subMenu.add(2, Menu.FIRST+5, Menu.NONE, "菜单项4");  
          
        return true;//如果希望现实菜单,返回true  
    }  
  
上面的代码演示了如何创建子菜单,其菜单项的响应其实就是普通菜单项的响应
3,图标菜单Icon Menu

Android支持在菜单上显示各种各样的图标,这一点我们在上面创建子菜单时已经用到了


[java] view plaincopy
SubMenu subMenu = menu.addSubMenu(1, Menu.FIRST+1, 2, "网络设置" );//子菜单支持图标  
subMenu.setIcon(R.drawable.ic_launcher);  

Android中并不是所谓的菜单项都能加上图标,以下菜单项都是不可以的(这并不意味着程序会报错,而是运行时图标得不到显示):


扩展的菜单项。
子菜单的菜单项
上下文菜单的菜单项
4,ContextMenu简介
在Windows中,我们已经习惯了在文件上单击右键来执行“打开”、“重名名”、“剪切”、“删除”等操作,这个右键弹出的菜单就是上下文菜单.
android是通过长按某个视图元素来弹出上下文菜单的.
上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过
registerForContextMenu(Viewview)来指定。

下面给出一个demo演示如何创建和响应上下文菜单:

1.在activity的onCreate(...)方法中为一个view注册上下文菜单

2.在onCreateContextMenuInfo(...)中生成上下文菜单。

3.在onContextItemSelected(...)中响应上下文菜单项。

 
[java] view plaincopy
public class MenuDemoActivity extends Activity {  
    private ListView listView;   
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        initView();//做一些初始化工作  
    }  
  
    private void initView() {  
        listView = (ListView) this.findViewById(R.id.listview);  
        listView.setAdapter(new MyAdapter());  
        this.registerForContextMenu(listView);//1 为所有列表项注册上下文菜单,注意和响应事件不一样  
          
          
    }  
    //给ListView提供一些数据  
    private class MyAdapter extends BaseAdapter{  
  
        public int getCount() {  
              
            return 5;  
        }  
  
        public Object getItem(int position) {  
            // TODO Auto-generated method stub  
            return null;  
        }  
  
        public long getItemId(int position) {  
            // TODO Auto-generated method stub  
            return 0;  
        }  
  
        public View getView(int position, View convertView, ViewGroup parent) {  
            TextView tv = new TextView(MenuDemoActivity.this);  
            tv.setText("文件"+position);  
            return tv;  
        }  
          
    }  
      
    @Override  
    //2 创建上下文菜单  
    public void onCreateContextMenu(ContextMenu menu, View v,  
            ContextMenuInfo menuInfo) {  
          
        super.onCreateContextMenu(menu, v, menuInfo);  
        menu.setHeaderTitle("文件操作");  
        menu.add(1, Menu.FIRST, Menu.NONE, "发送");  
        menu.add(1, Menu.FIRST+1, Menu.NONE, "标记为重要");  
        menu.add(1, Menu.FIRST+2, Menu.NONE, "重命名");  
        menu.add(1, Menu.FIRST+3, Menu.NONE, "删除");  
    }  
      
    @Override  
    //3 响应上下文菜单  
    public boolean onContextItemSelected(MenuItem item) {  
        switch(item.getItemId()){  
        case 1:  
            Toast.makeText(this, "发送", 1).show();  
            break;  
        case 2:  
            Toast.makeText(this, "标记为重要", 1).show();  
            break;  
        case 3:  
            Toast.makeText(this, "重命名", 1).show();  
            break;  
        case 4:  
            Toast.makeText(this, "删除", 1).show();  
            break;  
        default:  
              
            return super.onContextItemSelected(item);  
        }  
        return true;  
    }  
}  
      
      
运行程序,多次调出上下文菜单,注意LogCat的输出,onCreateContextMenu每一次都被调用了。
0 0
原创粉丝点击