天天看點

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")+"這是菜單顯示文本");
    }
}
           

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