Android_上下文菜单两种创建模式

本文详细介绍了Android系统中的两种上下文菜单模式:浮动模式和动作模式。浮动模式在用户长按视图元素后弹出,覆盖部分用户界面;动作模式则在屏幕顶部显示上下文动作条,适用于Android3.0及以上版本,是推荐的使用方式。文章通过实例代码演示了如何创建这两种上下文菜单。

上下文菜单

天地之功不可仓促,艰难之业当累日月。 --后汉书

当用户长按某个视图或视图元素后出现的浮动菜单,菜单中所包含的动作是与用户所选择视图元素相关的

Android系统中的两种上下文菜单模式

浮动模式

​ 用户在视图元素上执行一个长点击(按住并保持)事件,上下文菜单项浮动列表会弹出,类似对话框,显示在原有视图的上面,覆盖原有的部分用户界面。用户可以每次在浮动菜单中选择一个可执行动作。

动作模式

  • 这种模式是ActionMode的系统实现,可以在屏幕顶部显示上下文动作条,其中的菜单项是与所选视图元素相关的动作。用户可以在使用上下文菜单的动作条中选择一个或者多个动作。
  • 这种模式只有在Android3.0或者更高版本中可用,是使用上下文菜单的推荐模式。

浮动模式创建步骤

  • 创建弹出菜单配置文件XML

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.example.contextmenu.MainActivity">
        <item
            android:id="@+id/action_AY"
            android:orderInCategory="50"
            android:title="@string/AY"
            app:showAsAction="ifRoom" />
        <item
            android:id="@+id/action_GZ"
            android:orderInCategory="100"
            android:title="@string/GZ"
            app:showAsAction="ifRoom" />
    </menu>
    
  • 添加弹出菜单到对应的View控件上

    im = findViewById(R.id.image);
    
    • 创建上下文菜单

      • 覆盖Activity的onCreateContextMenu()方法

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                getMenuInflater().inflate(R.menu.menu_main,menu);
                super.onCreateContextMenu(menu, v, menuInfo);
            }
        
        
      • 调用Menu的add()方法添加菜单项(Menulitem)

          menu.add(0,3,0,"玩耍");
                /*
                * 第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单选项
                * 第二个int类型的Item ID参数,代表的是项目编号。这个参数非常重要
                * 第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认0
                * 第三个String类型的title参数,表示的是选项中的显示文字
                * */
        
    • 调用registerForContextMenu()方法为视图注册上下文菜单

         registerForContextMenu(im);
      
  • 定义菜单事件响应

    • 覆盖Activity的onContextItemSelected()来响应事件

       @SuppressLint("NonConstantResourceId")
          @Override
          public boolean onContextItemSelected(@NonNull MenuItem item) {
              switch (item.getItemId()){
                  case R.id.action_AY:
                      im.setImageResource(R.drawable.png1);
                      Toast.makeText(this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show();
                      break;
                  case R.id.action_GZ:
                      im.setImageResource(R.drawable.png2);
                      Toast.makeText(this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show();
                      break;
                  case 3:
                      im.setImageResource(R.drawable.png0);
                      Toast.makeText(this,"疯狂玩耍中。。。。",Toast.LENGTH_SHORT).show();
                      break;
              }
              return super.onContextItemSelected(item);
          }
      

整个java源码

public class MainActivity extends AppCompatActivity {
    ImageView im;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
		binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
           /*需要绑定的控件*/
         im = findViewById(R.id.image);
            /*注册上下文菜单到控件上*/
         registerForContextMenu(im);
    }

    /*创建上下文菜单*/
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.menu_main,menu);
        menu.add(0,3,0,"玩耍");
        /*
        * 第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单选项
        * 第二个int类型的Item ID参数,代表的是项目编号。这个参数非常重要
        * 第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认0
        * 第三个String类型的title参数,表示的是选项中的显示文字
        * */
        super.onCreateContextMenu(menu, v, menuInfo);
    }
    
 /*上下文菜单点击事件*/
    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_AY:
                im.setImageResource(R.drawable.png1);
                Toast.makeText(this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_GZ:
                im.setImageResource(R.drawable.png2);
                Toast.makeText(this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show();
                break;
            case 3:
                im.setImageResource(R.drawable.png0);
                Toast.makeText(this,"疯狂玩耍中。。。。",Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onContextItemSelected(item);
    }
}

actionMode创建步骤(动作模式)

  • 创建弹出菜单配置文件XML

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.example.contextmenu.MainActivity">
        <item
            android:id="@+id/action_AY"
            android:orderInCategory="50"
            android:title="@string/AY"
            android:icon="@drawable/png1"
            app:showAsAction="ifRoom" />
        <item
            android:id="@+id/action_GZ"
            android:orderInCategory="100"
            android:title="@string/GZ"
            android:icon="@drawable/png2"
            app:showAsAction="ifRoom" />
    </menu>
    
  • 添加弹出菜单到对应的View控件上

    findViewById(R.id.image2)
    
    • 创建ActionMode

      private android.view.ActionMode actionMode;

      private ActionMode actionMode;
      
    • 实现Action Mode的callback接口

       final ActionMode.Callback callback = new ActionMode.Callback() {
                  @Override
                  public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                      actionMode.getMenuInflater().inflate(R.menu.menu_main,menu);
                      return true; //返回值为true
                  }
      
                  @Override
                  public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                      return false;
                  }
      
                  @Override
                  public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                      switch (menuItem.getItemId()){
                          case R.id.action_AY:
                              im.setImageResource(R.drawable.png1);
                              Toast.makeText(ContextMenu2.this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show();
                              break;
                          case R.id.action_GZ:
                              im.setImageResource(R.drawable.png2);
                              Toast.makeText(ContextMenu2.this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show();
                              break;
                      }
                      return true;
                  }
      
                  @Override
                  public void onDestroyActionMode(ActionMode actionMode) {
      
                  }
              };
      
    • 调用setOnlongClickListener()方法为视图注册上下文菜单

       findViewById(R.id.image2).setOnLongClickListener();
      
  • 定义菜单响应事件

    • 设置控件的OnLongClickListener()来响应事件

       findViewById(R.id.image2).setOnLongClickListener(new View.OnLongClickListener() {
                  @Override
                  public boolean onLongClick(View view) {
                      if(actionMode != null){
                          return false;
                      }
                      actionMode = startActionMode(callback);
                      view.setSelected(true);
                      return true;
                  }
              });
      

整个java源码

public class ContextMenu2 extends AppCompatActivity {
    private ActionMode actionMode;
    ImageView im;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityContextMenu2Binding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        im =findViewById(R.id.image2);

       final ActionMode.Callback callback = new ActionMode.Callback() {
            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                actionMode.getMenuInflater().inflate(R.menu.menu_main,menu);
                return true; //返回值为true
            }

            @Override
            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                switch (menuItem.getItemId()){
                    case R.id.action_AY:
                        im.setImageResource(R.drawable.png1);
                        Toast.makeText(ContextMenu2.this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_GZ:
                        im.setImageResource(R.drawable.png2);
                        Toast.makeText(ContextMenu2.this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show();
                        break;
                }
                return true;
            }

            @Override
            public void onDestroyActionMode(ActionMode actionMode) {

            }
        };

        findViewById(R.id.image2).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                if(actionMode != null){
                    return false;
                }
                actionMode = startActionMode(callback);
                view.setSelected(true);
                return true;
            }
        });



    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ColdKite_鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值