先來認識一下上下文菜單是什么樣子的?如圖,當長按一個控件時彈出來的菜單叫做上下文菜單:
圖中第一個和第二個就是一個上下文菜單,第二個菜單里面還有一層菜單,這個上下文菜單被綁定到注冊按鈕中,也就是長按注冊按鈕后就會彈出上下文菜單,當然這個上下文菜單也可以綁定到其他的控件中,看自己的意愿了。
下面我們就來看看如何實現這么樣的一個功能吧!
首先就是新建一個context.xml文件:
然后就是編寫context.xml文件了:里面就是放了兩個菜單,在第二個菜單里面又放了兩個菜單。
剩下的就是怎么把菜單和按鈕綁定和每個菜單的點擊事件了:
1.注冊
registerForContextMenu(findViewById(R.id.button));? 通過這句話來注冊,也就是把這個菜單和id為button的按鈕綁定,長按id為button的按鈕后彈出菜單。
2.創建
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getMenuInflater().inflate(R.menu.context,menu);
}
3.菜單項的操作
@SuppressLint("NonConstantResourceId")
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {int id = item.getItemId();if (id == R.id.diyi){Toast.makeText(this, "第一個按鈕被按下", Toast.LENGTH_SHORT).show();}if (id == R.id.dier){Toast.makeText(this, "第2個按鈕被按下", Toast.LENGTH_SHORT).show();}if (id == R.id.disan){Toast.makeText(this, "第3個按鈕被按下", Toast.LENGTH_SHORT).show();}if (id == R.id.disi){Toast.makeText(this, "第4個按鈕被按下", Toast.LENGTH_SHORT).show();}return super.onContextItemSelected(item);
}
通過以上3步就能把上下文菜單調出來了,這個實現的是在屏幕中間彈出上下文菜單,還有一種是在屏幕頂部出現上下文菜單,這個在頂部出現上下文菜單的方法是:
想要實現上圖這樣的功能,為按鈕設置上下文操作模式,要分為兩步:
第一步:監聽按鈕的長按事件,設置上下文模式,調用回調函數。
findViewById(R.id.button).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {startActionMode(cd);return true;}
});
第二步:重寫創建菜單的方法:
@Override //重寫創建菜單的方法public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu,menu); //獲取菜單對象return true;}
第三步:實現接口ActionMode CallBack,也就是重寫回調函數:
ActionMode.Callback cd = new ActionMode.Callback() {// 創建 在啟動上下文操作模式(startActionMode(Callback))時調用@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {Toast.makeText(MainActivity.this, "上下文被創建", Toast.LENGTH_SHORT).show();getMenuInflater().inflate(R.menu.context,menu);return true;}// 準備 在創建方法后進行調用@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {Toast.makeText(MainActivity.this, "上下文被準備", Toast.LENGTH_SHORT).show();return true;}//當選項被點擊時調用@Overridepublic boolean onActionItemClicked(ActionMode Mode, MenuItem Item) {int id = Item.getItemId();if(id == R.id.diyi){Toast.makeText(MainActivity.this, "第1項被點擊", Toast.LENGTH_SHORT).show();}if(id == R.id.dier){Toast.makeText(MainActivity.this, "第2項被點擊", Toast.LENGTH_SHORT).show();}if(id == R.id.disan){Toast.makeText(MainActivity.this, "第3項被點擊", Toast.LENGTH_SHORT).show();}if(id == R.id.disi){Toast.makeText(MainActivity.this, "第4項被點擊", Toast.LENGTH_SHORT).show();}return true;}//上下文操作模式結束時被調用@Overridepublic void onDestroyActionMode(ActionMode actionMode) {Toast.makeText(MainActivity.this, "上下文操作結束了!", Toast.LENGTH_SHORT).show();}};
整體的代碼:
package com.example.myapplication4;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});findViewById(R.id.textview1).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {startActionMode(cd);return true;}});}@Override //重寫創建菜單的方法public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu,menu); //獲取菜單對象return true;}ActionMode.Callback cd = new ActionMode.Callback() {@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {getMenuInflater().inflate(R.menu.menu, menu);Toast.makeText(MainActivity.this, "創建成功", Toast.LENGTH_SHORT).show();return true;}@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {Toast.makeText(MainActivity.this, "準備成功", Toast.LENGTH_SHORT).show();return true;}@Overridepublic boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {int id = menuItem.getItemId();if(id == R.id.diyi){Toast.makeText(MainActivity.this, "第一項被點擊", Toast.LENGTH_SHORT).show();}else if(id == R.id.dier){Toast.makeText(MainActivity.this, "第2項被點擊", Toast.LENGTH_SHORT).show();}else if(id == R.id.disan){Toast.makeText(MainActivity.this, "第3項被點擊", Toast.LENGTH_SHORT).show();}return true;}@Overridepublic void onDestroyActionMode(ActionMode actionMode) {Toast.makeText(MainActivity.this, "被銷毀", Toast.LENGTH_SHORT).show();}};}
通過以上的設置,就能實現上下文菜單的操作了。