【达内课程】ContextMenu

介绍

ContextMenu 即上下文菜单,是通过长按(1.5s)界面上的某个控件弹出的菜单。

控件必须注册了 ContextMenu 以后,长按才会弹出 ContextMenu ,注册方式为调用registerForContextMneu(View) 方法。

【配置菜单】
参考 OptionMenu,重写 onCreateContextMenu()方法,在该方法中,第 1 个参数用于创建菜单项,第 2 个参数 View v 表示长按哪个控件弹出的 ContextMenu,第 3 个参数通常不需要使用,仅当为 AdapterView 配置了 ContextMenu 后,可以将第 3 个参数向下转型为 AdapterContextMenuInfo 的对象,然后获取相关信息,如 position 等。

【响应菜单项的点击】
参考 OptionMenu,重写 onContextItemSelected

xml创建ContextMenu

menu 下创建菜单布局 main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_copy"
        android:orderInCategory="100"
        android:title="Copy"
        app:showAsAction="never" />
</menu>

MenuActivity.java

public class MenuActivity extends AppCompatActivity {
    private View tv;
    private View img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        tv = findViewById(R.id.textView);
        img = findViewById(R.id.imageView);

        //注册上下文菜单
        registerForContextMenu(tv);
        registerForContextMenu(img);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.main, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_copy:
                Toast.makeText(this, "点击了Copy", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onContextItemSelected(item);
    }
}

MenuActivity 的布局就是一个 TextView 和一个 ImageView

运行程序:
在这里插入图片描述

动态创建ContextMenu

public class MenuActivity extends AppCompatActivity {
    private View tv;
    private View img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        tv = findViewById(R.id.textView);
        img = findViewById(R.id.imageView);

        //注册上下文菜单
        registerForContextMenu(tv);
        registerForContextMenu(img);
    }

    public static final int MENU_ITEM_COPY_TEXT = 1;
    public static final int MENU_ITEM_SAVE_TO_FILE = 2;
    public static final int MENU_ITEM_EDIT_IMAGE = 3;
    public static final int MENU_ITEM_RESEND_IMAGE_ = 4;

    @Override
    public void onCreateContextMenu(ContextMenu menu,
                                    View v,//长按哪个控件弹出的菜单
                                    ContextMenu.ContextMenuInfo menuInfo) {
        switch (v.getId()) {
            case R.id.textView:
                menu.add(Menu.NONE, 1, Menu.NONE, "复制文字");
                menu.add(Menu.NONE, 2, Menu.NONE, "保存到文件");
                break;
            case R.id.imageView:
                menu.add(Menu.NONE, 3, Menu.NONE, "编辑图片");
                menu.add(Menu.NONE, 4, Menu.NONE, "转发图片");
                break;

        }
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case MENU_ITEM_COPY_TEXT:
                Toast.makeText(this, "点击了 复制文字", Toast.LENGTH_SHORT).show();
                break;
            case MENU_ITEM_SAVE_TO_FILE:
                Toast.makeText(this, "点击了 保存到文件", Toast.LENGTH_SHORT).show();
                break;
            case MENU_ITEM_EDIT_IMAGE:
                Toast.makeText(this, "点击了 编辑图片", Toast.LENGTH_SHORT).show();
                break;
            case MENU_ITEM_RESEND_IMAGE_:
                Toast.makeText(this, "点击了 转发图片", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onContextItemSelected(item);
    }
}

运行程序:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值