安卓开发--安卓组件长按显示上下文菜单-registerForContextMenu()

Android有一个类似于pc上右键弹出菜单的功能,即在安卓组件上注册上下文菜单,注册之后长按大概一两秒就会弹出一个可以选择的菜单,任何视图都可以注册上下文菜单.

大体步骤:

1.写菜单内容

通过在Activity主类中重写public void onCreateContextMenu()函数实现,这个函数与onCreate()函数并列

2.写菜单点击事件响应

通过重写public boolean onContextItemSelected(@NonNull MenuItem item)函数实现,这个函数也与onCreate()函数并列

3.为要显示上下文菜单的组件注册菜单,即把菜单与要显示菜单的组件关联

通过调用this.registerForContextMenu()函数实现,这个函数在onCreate()函数中

具体实现:

1.首先做好布局,本次示例有一个Button,一个TextView,一个EditTex.另外在后边加一个textView用来显示菜单点击后的各种信息.

做好布局,id分别命名为textView1,button1,editText1,然后自定义组件上显示的文字.

2.重写菜单内容函数

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0,0,0,"菜单一"); 
//第一个数,第二个数是菜单选项上下排列的序号,第三个数是菜单的子菜单序号
    menu.add(0,1,0,"菜单二");
    menu.add(0,1,1,"菜单二的扩展");
    menu.add(0,2,0,"菜单三");
} //end onCreateContextMenu

3.重写菜单点击事件响应函数

@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
    String title = item.getTitle().toString();//获取菜单名称,即显示的字符串
    int itemId = item.getItemId();//获取菜单id
    show.setText(title+String.format("\nID:%d",itemId));
    return super.onContextItemSelected(item);
}

4.为组件注册上下文菜单

this.registerForContextMenu(textView1);

示例代码:

Java

package cn.edu.ujn.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textView1;
    private Button button1;
    private EditText editText1;
    private TextView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView1 = findViewById(R.id.textView1);
        button1 = findViewById(R.id.button1);
        editText1 = findViewById(R.id.editText1);
        show = findViewById(R.id.textView2);

        this.registerForContextMenu(textView1);
        this.registerForContextMenu(button1);

    } //end onCreate

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0,0,0,"菜单一"); //第一个数,第二个数是菜单选项上下排列的序号,第三个数是菜单的子菜单序号
        menu.add(0,1,0,"菜单二");
        menu.add(0,1,1,"菜单二的扩展");
        menu.add(0,2,0,"菜单三");

    } //end onCreateContextMenu

    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        String title = item.getTitle().toString();//获取菜单名称,即显示的字符串
        int itemId = item.getItemId();//获取菜单id
        show.setText(title+String.format("\nID:%d",itemId));
        return super.onContextItemSelected(item);
    }
} //end class

layout

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="长按显示上下文菜单"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="长按我"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView1" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="长按显示菜单"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text=""
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText1" />


</androidx.constraintlayout.widget.ConstraintLayout>

关于menu.add(a,b,c,"菜单一"); 参数的问题,我自己测试推断出他的显示顺序,b是最低位,c是最高位,a是中间那位,即cab排成的数,比如menu.add(3,6,4,"菜单一"),算出来是436,然后数小的在上面.

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给您提供以下实现步骤: 1. 在您的Activity中,为ListView注册ContextMenu,可以在onCreate()方法中使用registerForContextMenu()方法实现: ```java registerForContextMenu(listView); ``` 2. 实现ListView的按事件,可以在onCreate()方法中使用setOnItemLongClickListener()方法实现: ```java listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // 在这里处理按事件 return false; } }); ``` 3. 在按事件中弹出ContextMenu,可以在onCreateContextMenu()方法中创建ContextMenu并添加菜单项: ```java @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); // 创建ContextMenu,并添加菜单项 } ``` 4. 在ContextMenu菜单项中添加删除操作,可以在onContextItemSelected()方法中获取选择的菜单项,并进行相应的操作: ```java @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.delete: adapter.remove(adapter.getItem(info.position)); // 删除ListView中的数据项 adapter.notifyDataSetChanged(); // 通知ListView数据已经改变 return true; default: return super.onContextItemSelected(item); } } ``` 以上就是实现ListView按弹出ContextMenu并进行删除操作的步骤,您可以根据自己的需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值