Android --- 菜单 Menu

2024-05-09 1016阅读

选项菜单 OptionsMenu

添加menu选项的两种方法

都需要重写 Activity.onCreateOptionsMenu(Menu menu) 添加菜单

用xml添加(更建议使用)

创建一个菜单布局 :

  • 在 res文件下新建一个menu 目录,此时的菜单id为:R.menu.option

    Android --- 菜单 Menu

        
        
        
        
        
        
            
                
                
                
                
            
        
    

    在需要添加选项菜单的布局对应的activity中重写 onCreateOptionsMenu 方法加载选项菜单-此时是MainActivity

    getMenuInflater().inflate(R.menu.option,menu); // 加载菜单资源
    // 创建optionMenu
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // 加载菜单资源
            getMenuInflater().inflate(R.menu.option,menu);
            return true;
        }

    使用Java添加

    • Menu 类 SubMenu 子菜单类
    • Menu类参数:组id 菜单项id 菜单项序号 菜单项名称

      重写 onCreateOptionsMenu 方法,利用以上类添加选项菜单,菜单项序号是指菜单项的位置

      // 创建optionMenu
          @Override
          public boolean onCreateOptionsMenu(Menu menu) {
              
              /* 纯代码设计
               * Menu 类 SubMenu 子菜单类*/
              /* Menu 类参数:组id 菜单项 id 菜单项序号 菜单项名称 */
              menu.add(1,1,3,"菜单1");
              menu.add(1,2,2,"菜单2");
              SubMenu subMenu = menu.addSubMenu(1,3,1,"子菜单的主菜单");
              subMenu.add(2,22,1,"子菜单2");
              subMenu.add(2,11,2,"子菜单1");
              return true;
          }

      Android --- 菜单 Menu

      两个方法 

      • 重写 Activity.onCreateOptionsMenu(Menu menu) 添加菜单(见上)
      • 重写 Activity.onOptionsItemSelected(@NonNull MenuItem item) 选择某个菜单选项的回调方法,根据id来判断进行的操作
            // optionMenu 的选中方法
            @Override
            public boolean onOptionsItemSelected(@NonNull MenuItem item) {
                if (item.getItemId() == R.id.m1) {
                    Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show();
                } else if (item.getItemId() == R.id.m2) {
                    Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show();
                }
                return super.onOptionsItemSelected(item);
            }
        ​

        上下文菜单 ContextMenu

        长按按钮弹出菜单

        创建菜单布局

        • 在 res文件下新建一个menu 目录,此时的菜单id为:R.menu.context
              
              
              
              
              
                  
                      
                      
                      
                  
              
          

          创建菜单

          在activity_main.xml里添加一个按钮用以打开上下文菜单

              
          

           上下文菜单的使用步骤:

          1.注册

          在 activity_main.xml 布局对应的 activity 中的 onCreate() 方法中进行注册

          protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
                  // ContextMenu 上下文菜单的使用
                  // 1.注册
                  registerForContextMenu(findViewById(R.id.ctx_btn));
           }

          2.创建 - 覆盖父类的 onCreateContextMenu 方法,加载菜单资源

          // 2.创建contextMenu
              @Override
              public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                  getMenuInflater().inflate(R.menu.context,menu);
              }

          3菜单项的操作 - 覆盖父类的 onContextItemSelected 方法

          // 3.contextMenu 菜单项选项操作
              @Override
              public boolean onContextItemSelected(@NonNull MenuItem item) {
                  int itemId = item.getItemId();
                  Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
                  return super.onContextItemSelected(item);
              }

          Android --- 菜单 Menu

          上下文菜单 - 上下文操作模式 

           菜单会出现在状态栏的位置

          1. 实现接口 ActonMode.CallBack 中不同的回调方法

          ActionMode.Callback ac =new ActionMode.Callback(){
                  // 创建:在启动上下文操作模式(startActionMode(Callback))时调用
                 @Override
                 public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                     Log.e("上下文操作模式","--创建--");
                     getMenuInflater().inflate(R.menu.context,menu);
                     return true;
                 }
                 // 准备:在创建方法后进行调用
                 @Override
                 public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                     Log.e("上下文操作模式","--准备--");
                     return false;
                 }
                 // 菜单项被点击
                 @Override
                 public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                     /* 环境变量此时需要这样是因为这是一个内部类 ButtonActivity.this */
                     Log.e("上下文操作模式","--点击--");
                     Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
                     return true;
                 }
                 // 结束:上下文操作模式结束时调用
                 @Override
                 public void onDestroyActionMode(ActionMode mode) {
                     Log.e("上下文操作模式","--结束--");
                 }
             };

          2. 添加一个按钮用以打开,上下文操作模式

           
          

          3.在View的长按事件中启动上下文操作模式 

          findViewById(R.id.ctx_opbtn).setOnLongClickListener(new View.OnLongClickListener() {
                      @Override
                      public boolean onLongClick(View v) {
                          startActionMode(ac);
                          return false;
                      }
                  });

          弹出式菜单

          一般出现在被绑定的View下方,如果下方没有空间则出现在上方

          添加一个按钮

           

          为这个按钮添加点击事件,并将弹出式菜单绑定在按钮的点击事件上 

          // 将弹出式菜单绑定在按钮的点击事件上
                  Button popbtn = findViewById(R.id.pop_btn);
                  popbtn.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          // 1.实例化 PopupMenu 对象
                          /* 参数一 上下文环境
                           * 参数二 被锚定的(绑定)的button*/
                          PopupMenu popupMenu = new PopupMenu(ButtonActivity.this,popbtn);
                          // 2.加载菜单资源:利用MenuInflater将Menu资源加载到PopMenu.getMenu() 所返回的Menu对象中
                          popupMenu.getMenuInflater().inflate(R.menu.context,popupMenu.getMenu());
                          // 3.菜单子项点击操作
                          popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                              @Override
                              public boolean onMenuItemClick(MenuItem item) {
                                  Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
                                  return false;
                              }
                          });
                          // 显示菜单
                          popupMenu.show();
                      }
                  });

          Android --- 菜单 Menu

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]