zoukankan      html  css  js  c++  java
  • Android学习之Menu

    1.普通的Menu

    在Activity中覆盖onCreateOptionsMenu(Menu menu)方法,该方法负责生产menu,它是一个回调函数,即当按下手机设备上的menubutton时Android系统才会生产菜单。

    public boolean onCreateOptionsMenu(Menu menu) {
      //menu.add(arg0, arg1, arg2, arg3)给button加入一项菜单
      //第一个參数:分组的id,假设不用分组则设为0
      //第二个參数:menu中每一项的id,这个id应该是唯一的
      //第三个參数:排序的信息,依据这个字段的大小,menu对当中的项进行排序显示:小的排在前面
      //第四个參数:menu项的显示信息
      menu.add(0, MENU_ITEM_1, 0, "APPLE");
      menu.add(0, MENU_ITEM_2, 0, "ORANGE");
      return super.onCreateOptionsMenu(menu);
     }

    假设要加入单击事件,则要覆盖onOptionsItemSelected(MenuItem item)方法。

    public boolean onOptionsItemSelected(MenuItem item) {
      //通过id推断传来的item,这个id通过item.getItemId()得到
      switch(item.getItemId()){
      case MENU_ITEM_1:
       t = Toast.makeText(this, "you choose the apple", Toast.LENGTH_SHORT);
       t.show();
       break;
      case MENU_ITEM_2:
       t = Toast.makeText(this, "you choose the orange", Toast.LENGTH_SHORT);
       t.show();
       break;
      }
      return true;
     }

    2.子菜单(SubMenu)

    public boolean onCreateOptionsMenu(Menu menu) {
      menu.add(0, MENU_ITEM_1, 1, "APPLE");
      menu.add(0, MENU_ITEM_2, 2, "ORANGE");

      //为menu创建SubMenu对象
      SubMenu subMenu = menu.addSubMenu(0, MENU_ITEM_3, 3, "BANANA");

      //向subMenu中加入选项
      subMenu.add(0, 31, 31, "BIG BANANA");
      subMenu.add(0, 32, 32, "SMALL BANANA");
      return super.onCreateOptionsMenu(menu);
     }

    3.上下文菜单(ContextMenu)——长按特定View后弹出的菜单

    不论什么视图都能够注冊ContextMenu,但最常见的是用于列表视图ListView的item。

    在onCreate方法中为View注冊ContextMenu。

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.contextmenu);
      btn1 = (Button)findViewById(R.id.btn1);
      btn2 = (Button)findViewById(R.id.btn2);
      //为Button注冊ContextMenu
      registerForContextMenu(btn1);
      registerForContextMenu(btn2);
     }

    覆盖Activity的onCreateContenxtMenu()方法,调用Menu的add方法加入菜单项(MenuItem)

    public void onCreateContextMenu(ContextMenu menu, View v,
       ContextMenuInfo menuInfo) {
       if(v==btn1){

       //设置菜单标题
       menu.setHeaderTitle("this is the frist");

       //加入菜单
       menu.add(0, 200, 0, "context menu 1");
       menu.add(0, 201, 0, "context menu 2");
      }
      if(v==btn2){

       //设置菜单标题
       menu.setHeaderTitle("this is the second");

       //加入菜单
       menu.add(0, 300, 0, "context menu 3");
       menu.add(0, 301, 0, "context menu 4");
      }
      super.onCreateContextMenu(menu, v, menuInfo);
     }

    4.动态Menu

    onPrepareOptionsMenu()在菜单列表即将显示出来时决定哪些菜单要显示哪些不显示,当然也能够做一些其它工作。

    public boolean onPrepareOptionsMenu(Menu menu) {        
     String currentText = textview.getText().toString();        
     if("M".equals(currentText)){            
      //先清掉菜单 
      menu.clear();    
      //能够通过点击这个菜单项来改变textview的值,这样(变成N)就能够測试了
      MenuItem item = menu.add(0, 400, 401, "to N");
      //android自带的图标
      item.setIcon(android.R.drawable.alert_dark_frame);       
     }        
     if("N".equals(currentText)){            
      //先清掉菜单 
      menu.clear();   
      //能够通过点击这个菜单项来改变textview的值,这样(变成M)就能够測试了
      MenuItem item = menu.add(0, 401, 402, "to M");
      item.setIcon(android.R.drawable.alert_light_frame);        
     }      
     //如今共同拥有两个菜单子项
     menu.add(0, 402, 403, "Now is " + currentText);        
     return super.onPrepareOptionsMenu(menu);   
    }

    5.用XML文件方式创建Menu

    在res/文件夹下建一个文件夹,名为menu,以下建一个xml文件,名为menu_xml_file.xml

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/grout_main">
        <item android:id="@+id/menu_1"
                    android:title="This 1"/>
        <item android:id="@+id/menu_2" 
                android:title="This 2" /> 
    </group>
    </menu>

    在Activity中覆盖onCreateOptionsMenu(Menu menu)方法

    public boolean onCreateOptionsMenu(Menu menu) {
            //MenuInflater类用来实例化菜单XML文件成菜单对象

            //获取当前菜单
            MenuInflater inflater = getMenuInflater();
            //inflate(int menuRes, Menu menu)填充菜单

            //从一个指定的xml资源去填充菜单,假设有错误会抛掷InflateException

            //menuRes 要载入XML布局文件里的资源ID

            //menu 要填充的菜单,这些项目和子菜单就被加入到要填充菜单中

            inflater.inflate(R.menu.menu_xml_file, menu);
            return true;
        }

    其它都和在Activity中创建Menu同样。

     

    小知识:单击MENUbutton时,在Activity中回调的函数可能有两个:

    第一个是onOptionsItemSelected(),这个函数仅仅在第一次单击当前应用中的MENUbutton时回调,以后再不回调。

    第二个是onPrepareOptionsMenu(),这个函数在每次单击MENUbutton后显示MENU时被系统回调,每次MENU显示前都会回调此函数。我们一般依据条件改变MENU显示的逻辑都放在这个函数里面。

    转自:http://zhouyuting714.blog.163.com/blog/static/1811643182011327101931489/

  • 相关阅读:
    webpack学习遇到大坑(纯属自己记录)
    git忽略某些文件提交
    数据结构(一)创建并遍历线性列表
    数据结构二 顺序表的创建
    JqGrid动态改变列名
    构造DataTable
    计算机存储数据的单位
    .NET Core在WindowsServer服务器部署(使用Web Deploy发布)
    mysql ERROR 1045 (28000): 错误解决办法
    ASP.NET取得Request URL的各个部分
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/3985622.html
Copyright © 2011-2022 走看看