Android 中实现上下文菜单(Context menu)详解

Posted 路宇_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 中实现上下文菜单(Context menu)详解相关的知识,希望对你有一定的参考价值。

效果如图所示:
在这里插入图片描述
步骤一:实现activity_context_menu.xml和item_context.xml
1.1.activity_context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".ContextMenuActivity"
    android:orientation="vertical"
    android:gravity="center"
    >
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="上下文菜单"
        android:id="@+id/btn_menu"
        android:textColor="@color/black"
        android:textSize="20sp"
        />
    <TextView
        android:id="@+id/tv_menu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:gravity="left|center"
        />
</LinearLayout>

1.2.item_context.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item_time"
        android:title="改变时间"
        android:orderInCategory="1"
        >
    </item>
    <item
        android:id="@+id/item_color"
        android:title="改变颜色"
        android:orderInCategory="2"
        >
    </item>
    <item
        android:id="@+id/item_background"
        android:title="改变背景"
        android:orderInCategory="3"
        >
    </item>
</menu>

步骤二:实现ContextMenuActivity,注释已经在代码中给出

package com.example.buttomtest;

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

import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.buttomtest.util.DateUtil;

public class ContextMenuActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_menu;
    private TextView tv_menu;
    //声明颜色数组
    private int[] color={Color.BLACK,Color.WHITE,Color.YELLOW,
            Color.RED,Color.GREEN,Color.DKGRAY, Color.CYAN, Color.MAGENTA, Color.GRAY, Color.DKGRAY};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_context_menu);
        btn_menu=findViewById(R.id.btn_menu);
        tv_menu=findViewById(R.id.tv_menu);
        btn_menu.setOnClickListener(this);
        ctime();
    }

    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.btn_menu){
            //1.给按钮btn_menu先注册上下文菜单
            registerForContextMenu(v);
            //2.显示打开上下文菜单
            openContextMenu(v);
            //3.注销上下文菜单
            unregisterForContextMenu(v);
        }
    }

    //在页面恢复时调用
    @Override
    protected void onResume() {
        //这个是给文本视图注册上下文菜单,只要长按文本视图也可以显示上下文菜单
        registerForContextMenu(tv_menu);
        super.onResume();
    }

    //给文本视图注销上下文菜单
    @Override
    protected void onPause() {
        unregisterForContextMenu(tv_menu);
        super.onPause();
    }

    //在上下文菜单界面创建时调用
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.item_context,menu);
    }

    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        //获取菜单项的编号
        int id = item.getItemId();
        if (id == R.id.item_time){
            //改变时间
            ctime();
        }else if (id == R.id.item_color){
            //改变字体颜色
            tv_menu.setTextColor(changeBackground());
        }else if (id == R.id.item_background){
            //改变背景
            tv_menu.setBackgroundColor(changeBackground());
        }
        return super.onContextItemSelected(item);
    }
    //获取随机的颜色值
    private int changeBackground() {
        /**
         *Math是数学类,random()是Math类中的一个方法,random本身只产生(0~1)之间的小数,
         *random()*10 意思是产生0~10之间的小数 ,int(random()*10)的意思是强制取整,把小数部分去掉只去整数部分,
         * 所以 就变成了 产生0~9之间的整数。
         */
        int random = (int) (Math.random() * 10 % 10);
        return color[random];
    }

    private void ctime() {
        tv_menu.setText(DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss")+"这是菜单显示文本");
    }
}

以上就是上下文菜单的基本用法,如果不足,还望各位加以指正~

以上是关于Android 中实现上下文菜单(Context menu)详解的主要内容,如果未能解决你的问题,请参考以下文章

Android 上下文菜单(Context Menu)

Android学习笔记——创建一个简单的上下文菜单ContextMenu

在 Android 的单个菜单项中实现三个操作

如何在 KOTLIN 中实现 buttonX.setOnClickListener(this)? [复制]

Android选择条目时下方出现菜单选项

Ionic 4 - 自定义上下文菜单