zoukankan      html  css  js  c++  java
  • Android之菜单总结

    在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。

     1. 选项菜单(OptionsMenu)详解

          Activity中需要覆盖的常用的方法:

      public boolean onCreateOptionsMenu(Menu menu):使用此方法创建OptionsMenu。该方法只会在选项菜单第一次显示的时候被执行。

      public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作。

      public void onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。

      public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。

      public boolean onMenuOpened(int featureId, Menu menu):单打开后发生的动作。

    1)创建菜单

    @Override
    publicboolean onCreateOptionsMenu(Menu menu) {
    
        // 调用父类方法来加入系统菜单,虽然目前android还没有系统菜单,但是为了兼容到以后的版本,最好加上
      super.onCreateOptionsMenu(menu);
       
        // 3种方式添加菜单项
    // 1.直接指定标题
        menu.add("菜单项1");
    
        // 2.通过资源指定标题
        menu.add(R.string.menuitem2);
    
        // 3.显示指定菜单项的组号、ID、排序号、标题
        menu.add(
                1,            //组号,以便分组,进而能快速地操作同一组的菜单(如menu.removeGroup(group1))
                Menu.FIRST,   //唯一的ID号,可以自己指定,也可以让系统来自动分配,在响应菜单时你需要通过ID号来判断哪个菜单被点击了。
                Menu.FIRST,   //排序号,编号小的显示在前面。
           "菜单项3");   //标题
    
           // 如果希望显示菜单,请返回true
      return true;
    }

    2)响应菜单项

    @Override
    publicboolean onOptionsItemSelected(MenuItem item) {
    
        switch (item.getItemId()) {
    
        //响应每个菜单项(通过菜单项的ID)
      case1:
            // do something here
        break;
    
        case2:
            // do something here
        break;
    
        case3:
            // do something here
        break;
    
        case4:
            // do something here
        break;
    
        default:
            //对没有处理的事件,交给父类来处理
    
      returnsuper.onOptionsItemSelected(item);
    
        }
    
        //返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了
      return true;
    }

    也可以创建监听器来响应菜单事件,先于onOptionsItemSelected执行

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

    2.上下文菜单,选项菜单,子菜单

    一个完整的案例

    res/layout/main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        
        <TextView android:id="@+id/txt1" android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:text="@string/hello_contextMenu" />
            
        <TextView android:id="@+id/txt2" android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:text="@string/hello_subMenu" />
            
    </LinearLayout>

    res/values/strings.xml

    <?xml version="1.0" encoding="utf-8"?> <resources>     <string name="hello_contextMenu">Hello Context Menu</string>     <string name="hello_subMenu">Hello Context Sub Menu</string>     <string name="app_name">webabcd_menu</string> </resources>

    Main.java

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.SubMenu;
    import android.view.View;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.widget.TextView;
    import android.widget.Toast;
    
    // 演示两种菜单的实现方式:上下文菜单(通过在某元素上长按,来呼出菜单)和选项菜单(通过按手机上的菜单按钮,来呼出菜单)
    public class Main extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            // 为 R.id.txt1 注册一个上下文菜单(在此 TextView 上长按,则会呼出上下文菜单)
            // 具体呼出的菜单内容需要重写 onCreateContextMenu 来创建
            TextView txt1 = (TextView) this.findViewById(R.id.txt1);
            this.registerForContextMenu(txt1);
    
            // 为 R.id.txt2 注册一个上下文菜单
            TextView txt2 = (TextView) this.findViewById(R.id.txt2);
            this.registerForContextMenu(txt2);
        }
    
        // 重写 onCreateContextMenu 用以创建上下文菜单
        // 重写 onContextItemSelected 用以响应上下文菜单
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
    
            // 创建 R.id.txt1 的上下文菜单
            if (v == (TextView) this.findViewById(R.id.txt1)) {
                
                // ContextMenu.setIcon() - 设置菜单的图标
                // ContextMenu.setHeaderTitle() - 设置菜单的标题
                menu.setHeaderIcon(R.drawable.icon01);
                menu.setHeaderTitle("我是菜单");
                
                // 用 ContextMenu.add() 来增加菜单项,返回值为 MenuItem
                // 第一个参数:组ID
                // 第二个参数:菜单项ID
                // 第三个参数:顺序号
                // 第四个参数:菜单项上显示的内容
                menu.add(1, 0, 0, "菜单1");
                
                // MenuItem - 新增菜单项后的返回类型,针对菜单项的其他设置在此对象上操作 
                menu.add(1, 1, 1, "菜单2").setCheckable(true);
                
            }
            // 创建 R.id.txt2 的上下文菜单(多级上下文菜单)
            else if (v == (TextView) this.findViewById(R.id.txt2)) {
                
                // ContextMenu.addSubMenu("菜单名称") - 用来添加子菜单。子菜单其实就是一个特殊的菜单
                SubMenu sub = menu.addSubMenu("父菜单1");
                sub.setIcon(R.drawable.icon01);
                sub.add(0, 0, 0, "菜单1");
                sub.add(0, 1, 1, "菜单2");
                sub.setGroupCheckable(1, true, true);
    
                SubMenu sub2 = menu.addSubMenu("父菜单2");
                sub2.setIcon(R.drawable.icon01);
                sub2.add(1, 0, 0, "菜单3");
                sub2.add(1, 1, 1, "菜单4");
                sub2.setGroupCheckable(1, true, false);
                
            }
        }
        
        
        // 重写 onCreateOptionsMenu 用以创建选项菜单
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
    
            MenuItem menuItem = menu.add(0, 0, 0, "菜单111111111111111111111");
            
            // MenuItem.setIcon() - 设置菜单项的图标
            // MenuItem.setTitleCondensed() - 菜单的简标题,如果指定了简标题的话,菜单项上的标题将会以此简标题为准
            // MenuItem.setAlphabeticShortcut() - 设置选中此菜单项的快捷键
            // 注:菜单项超过 6 个的话,第 6 个菜单将会变为  More 菜单,多余的菜单会在单击 More 菜单之后显示出来
            menuItem.setIcon(R.drawable.icon01);
            menuItem.setTitleCondensed("菜单1");
            menuItem.setAlphabeticShortcut('a');
    
            menu.add(0, 1, 1, "菜单2").setIcon(R.drawable.icon02);
            menu.add(0, 2, 2, "菜单3").setIcon(R.drawable.icon03);
            menu.add(0, 3, 3, "菜单4");
            menu.add(0, 4, 4, "菜单5");
            menu.add(0, 5, 5, "菜单6");
            menu.add(0, 6, 6, "菜单7").setIcon(R.drawable.icon04);
            menu.add(0, 7, 7, "菜单8").setIcon(R.drawable.icon05);
    
            return true;
        }
    
        // 重写 onOptionsItemSelected 用以响应选项菜单
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            super.onOptionsItemSelected(item);
            
            Toast.makeText(Main.this, "被单击的菜单项为:" + String.valueOf(item.getItemId()), Toast.LENGTH_SHORT).show();
    
            return false;
        }
    }
  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/chengzhengfu/p/4579075.html
Copyright © 2011-2022 走看看