Android ContextMenu 上下文菜单

Android ContextMenu 上下文菜单是在长按某个 View 后出现的菜单,我们需要为这个 View 注册上下文菜单

ContextMenu

Android 没有提供 XML 形式的 ContextMenu 创建方法,也没有提供实例化一个类的创建方法,而是通过重写 Activity 中的几个方法来创建

Activity 提供了以下方法来给当前的 Activity 提供上下文菜单操作

方法 说明
onCreateContextMenu(menu, v,menuInfo) 创建一个上下文菜单
onContextItemSelected(MenuItem item) 当上下文菜单项被单击时触发
registerForContextMenu(view) 给一个 view 注册上下文菜单

就简简单单三个方法,调用顺序是

  1. 重写 onCreateContextMenu(menu, v,menuInfo) 创建上下文菜单

  2. 重写 onContextItemSelected(MenuItem item) 响应上下文菜单的点击

  3. onCreate() 中调用 registerForContextMenu(view) 为一个 View 注册上下文菜单

范例

下面我们就一步一步来创建一个 ContextMenu 吧,先放一下最后的效果图


  1. 创建一个 空的 Android 项目 cn.twle.android.ContextMenu

  2. 修改 activity_main.xml 添加一个 按钮 ( Button )

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal" 
        android:orientation="vertical" >
    
        <Button 
            android:id="@+id/btn_pop" 
            android:text="长按我弹出上下文菜单"  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    
  3. res 目录下新建一个资源目录 menu,然后在 res/menu 目录下新建文件 main_contextmenu.xml

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- checkableBehavior 的可选值由三个:single设置为单选,all为多选,none为普通选项 -->
        <group android:checkableBehavior="none">
            <item android:id="@+id/create"
                android:title="新建" />
            <item android:id="@+id/edit"
                android:title="编辑" />
        </group>
        <group android:checkableBehavior="single">
            <item android:id="@+id/save"
                android:title="保存" />
            <item android:id="@+id/save_as"
                android:title="另存为..." />
            <item android:id="@+id/help"
                android:title="帮助" />
        </group>
    </menu>
    
  4. 直接修改 MainActivity.java

    package cn.twle.android.contextmenu;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    import android.view.View;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.ContextMenu;
    
    import android.widget.Toast;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
        final private int OPEN = 111;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btn_pop = (Button)findViewById(R.id.btn_pop);
    
            registerForContextMenu(btn_pop);
    
        }
    
        //重写上下文菜单的创建方法
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                                        ContextMenu.ContextMenuInfo menuInfo) {
    
            // 如果要给多个 view 注册上下文菜单,可以根据 v 参数来判断
    
            MenuInflater inflator = new MenuInflater(this);
            inflator.inflate(R.menu.main_contextmenu, menu);
    
            menu.add(1,OPEN,1,"打开");
    
            super.onCreateContextMenu(menu, v, menuInfo);
        }
    
        //上下文菜单被点击时触发该方法
        @Override
        public boolean onContextItemSelected(MenuItem item) {
    
            // 菜单项被选中时触发
            int id = item.getItemId();
            String label = "";
    
            switch (id){
                case R.id.create:
                    label = "新建";
                    break;
                case OPEN:
                    label = "打开";
                    break;
                case R.id.help:
                    label = "帮助";
                    break;
            }
    
            Toast.makeText(getApplicationContext(),"你点击了:" + label,Toast.LENGTH_SHORT).show();
    
            return super.onContextItemSelected(item);
        }
    }
    

参考文档

  1. Android menus

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.