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

简介: 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")+"这是菜单显示文本");
    }
}

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


目录
相关文章
|
5月前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
162 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
7月前
|
XML Java Android开发
34. 【Android教程】菜单:Menu
34. 【Android教程】菜单:Menu
168 2
|
7月前
|
开发工具 Android开发 开发者
Android Studio中两个让初学者崩溃菜单
Android Studio中两个让初学者崩溃菜单
61 0
|
8月前
|
XML Android开发 数据格式
android 12 添加菜单
android 12 添加菜单
57 0
|
5月前
|
API Android开发
Android使用AlertDialog实现弹出菜单
本文分享了在Android开发中使用AlertDialog实现弹出菜单的方法,并通过代码示例和错误处理,展示了如何避免因资源ID找不到导致的crash问题。
83 1
|
8月前
|
Java Android开发
Android 长按电源键弹出的GlobalActions菜单
Android 长按电源键弹出的GlobalActions菜单
219 1
|
8月前
|
XML Java Android开发
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
780 1
|
8月前
|
Java Android开发
Android 长按桌面显示菜单的代码
Android 长按桌面显示菜单的代码
58 0
|
程序员 数据库 Android开发
面试问你Android中Context,你如何回答?
面试问你Android中Context,你如何回答?
115 0
|
Android开发
Android LayoutInflater.from(context).inflate()方法的作用
Android LayoutInflater.from(context).inflate()方法的作用
94 0