• android menu学习笔记


    android的菜单有两种,第一种是设备自带的menu菜单,第二种是长按某个组件的时候弹出的上下文菜单(类似于右键菜单)

    一、手机菜单Menu

    要手动创建Menu,不需要像其他组件一样去画界面,

    只需要重写public boolean onCreateOptionsMenu(Menu menu)方法

    如果要监听 则需要重写public boolean onOptionsItemSelected(MenuItem item)

    android默认规定menu菜单不能超过6个,否则的话就会在第六个按钮显示更多。

    直接上代码

    public boolean onCreateOptionsMenu(Menu menu){

      SubMenu engryMenu = menu.addSubMenu("愤怒"); // 设置菜单图标 engryMenu.setIcon(R.drawable.angrybirds); // 设置菜单打开后选项的图标 // hobbyMenu.setHeaderIcon(icon) // 设置菜单打开后选项的标题 engryMenu.setHeaderTitle("愤怒的小鸟"); // groupId,itemId,orderId engryMenu.add(0, bird1, 1, "bird1"); engryMenu.add(0, bird2, 2, "bird1"); SubMenu earlyMenu = menu.addSubMenu(0, 5, 1, "喜悦"); earlyMenu.setIcon(R.drawable.earlybird); earlyMenu.setHeaderTitle("喜悦的小鸟"); earlyMenu.add(0, bird3, 1, "bird3"); earlyMenu.add(0, bird4, 2, "bird4");
    }

    监听事件

    private final int bird1 = 1;
    private final int bird2 = 2;
    private final int bird3 = 3;
    private final int bird4 = 4;
    @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // TODO Auto-generated method stub
    
            int id = item.getItemId();
    
            switch (id) {
            case bird1:
                Toast.makeText(getApplication(), "bird1", 1).show();
                break;
            case bird2:
    
                break;
            case bird3:
    
                break;
            case bird4:
    
                break;
            case 5:
                Toast.makeText(getApplication(), "喜悦主菜单被选中", 1).show();
                break;
    
            default:
                break;
            }
    
            return super.onOptionsItemSelected(item);
        }

    menu还提供了XML方式的静态方式

    我们在res目录下创建一个menu类型的XML

    <menu
      xmlns:android="http://schemas.android.com/apk/res/android">
      
      <group android:id="@+id/staticGroup">
          <item android:id="@+id/staticMenu" android:title="menu1"></item>
          <item android:title="menu1"></item>
      </group>
    </menu>
    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // TODO Auto-generated method stub
    
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.static_menu, menu);
    
            return super.onCreateOptionsMenu(menu);
        }

    二、上下文菜单(右键菜单)

    上下文菜单是在我们为某个组件注册了registerForContextMenu方法之后,当我们长按该组件时候

    触发弹出上下文菜单(右键菜单是不是更形象?O(∩_∩)O)

    与上述提到的Menu菜单类似,上下文菜单同样也是通过一个方法(onCreateContextMenu)创建,一个方法来监听(onContextItemSelected)所不用的是他还需要registerForContextMenu某个组件

     1 @Override
     2     public void onCreate(Bundle savedInstanceState) {
     3 
     4         super.onCreate(savedInstanceState);
     5         setContentView(R.layout.context_menu);
     6         mTvMenu = (TextView) findViewById(R.id.tv_menu);
     7         // 注册 上下文菜单
     8         registerForContextMenu(mTvMenu);
     9 
    10     }
    11 
    12     @Override
    13     public void onCreateContextMenu(ContextMenu menu, View v,
    14             ContextMenuInfo menuInfo) {
    15         // TODO Auto-generated method stub
    16         super.onCreateContextMenu(menu, v, menuInfo);
    17         menu.setHeaderTitle("上下文菜单");
    18         menu.add("发送");
    19         menu.add("保存");
    20         menu.add("分享");
    21         menu.add("复制");
    22 
    23     }
    24 
    25     @Override
    26     public boolean onContextItemSelected(MenuItem item) {
    27         // TODO Auto-generated method stub
    28         return super.onContextItemSelected(item);
    29     }

    如果你对上下文菜单的机制有更进一步了解,可以移步这里http://www.cnblogs.com/codingmyworld/archive/2011/08/27/2155521.html

    对静态XML配置的话,则移步这里

    http://www.cnblogs.com/codingmyworld/archive/2011/08/28/2155594.html

    三、动态生成菜单

    有时候我们需要根据实际情况来生成不同的menu,比如现在有两个按钮menu1和menu2.

    我希望点击menu1的时候menu菜单只有menu1,而当点击了menu2的时候menu只会有menu2

    要实现这个功能,我们必须要了解另外一个非常重要的方法onPrepareOptionsMenu()

    这个方法跟onCreateOptionsMenu的区别在于

    onCreateOptionsMenu只会在第一次出发menu的时候才会调用

    而onPrepareOptionsMenu是每次点击menu菜单的时候都会触发

    为了避免onPrepareOptionsMenu中创建的menu跟onCreateOptionsMenu中创建的menu冲突

    可以在onPrepareOptionsMenu的最上头加上一句menu.clear。

    不多说直接上代码

     1 private Button bt_menu1;
     2     private Button bt_menu2;
     3     private int choose=0;
     4 
     5     @Override
     6     public void onCreate(Bundle savedInstanceState) {
     7 
     8         super.onCreate(savedInstanceState);
     9 
    10         setContentView(R.layout.menu);
    11 
    12         bt_menu1 = (Button) findViewById(R.id.bt_menu1);
    13         bt_menu2 = (Button) findViewById(R.id.bt_menu2);
    14 
    15         bt_menu1.setOnClickListener(new View.OnClickListener() {
    16 
    17             @Override
    18             public void onClick(View v) {
    19                 choose=0;
    20                 openOptionsMenu();
    21 
    22             }
    23         });
    24         bt_menu2.setOnClickListener(new View.OnClickListener() {
    25 
    26             @Override
    27             public void onClick(View v) {
    28                 choose=1;
    29                 openOptionsMenu();
    30 
    31             }
    32         });
    33 
    34     }
    35 @Override
    36     public boolean onPrepareOptionsMenu(Menu menu) {
    37         // TODO Auto-generated method stub
    38 
    39         // 清空 否则onCreateOptionsMenu()中的会叠加
    40         menu.clear();
    41         // 假设我们有两个按钮都
    42         if(choose==0){
    43             menu.add("menu1");
    44             
    45         }else{
    46             menu.add("menu2");
    47             
    48         }
    49 
    50         return super.onPrepareOptionsMenu(menu);
    51 
    52     }

    在按钮中如何触发menu事件,可以通过openOptionsMenu这个方法来完成

    或则可以通过模拟按钮来实现

     String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU;  
        Runtime runtime = Runtime.getRuntime();  
        Process proc = runtime.exec(keyCommand);  
  • 相关阅读:
    Luogu P3372 【模板】线段树 1
    Luogu P1439 【模板】最长公共子序列
    Luogu P3374 【模板】树状数组 1
    Computer Vision_33_SIFT:Improving Bag-of-Features for Large Scale Image Search——2010
    Computer Vision_33_SIFT:Distinctive Image Features from Scale-Invariant Keypoints——2004
    Computer Vision_33_SIFT:PCA-SIFT A More Distinctive Representation for Local Image Descriptors——2004
    Computer Vision_33_SIFT:Speeded-Up Robust Features (SURF)——2006
    Computer Vision_33_SIFT:Evaluation of Interest Point Detectors——2000
    Computer Vision_33_SIFT:Object recognition from local scale-invariant features——1999
    Image Processing and Analysis_21_Scale Space:Feature Detection with Automatic Scale Selection——1998
  • 原文地址:https://www.cnblogs.com/draem0507/p/3073597.html
Copyright © 2020-2023  润新知