目录
接下来运行一下MenuActivity就可以了(*^_^*)。tips:学习留存使用,欢迎积极的交流和批评指正。(ง •_•)ง
0.准备:创建item_menu, 之后的菜单都是以这个item_menu为基础的
-
创建menu源文件new resource directory 选择menu
-
在menu 下创建 menu resource file
-
menu是整个菜单,item是菜单中的项,item套menu就是菜单中套子菜单,相当于点击菜单后显示第一级的item(文件,编辑,视图),点击第一级的item中的子菜单menu后(点击文件)显示子菜单的item(复制,粘贴),android:title就是菜单中的一个个item选项的名称
-
以文件复制粘贴功能为例
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/file" android:title="文件"> <menu> <item android:id="@+id/file_copy" android:title="复制"/> <item android:id="@+id/file_paste" android:title="粘贴"/> </menu> </item> <item android:id="@+id/edit" android:title="编辑"/> <item android:id="@+id/view" android:title="视图"/> </menu>
-
新建package menu
-
新建MenuActivity
1. 选项菜单
-
onCreate方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); }
-
重写onCreateOptionsMenu方法创建menu 此方法用于创建选项菜单,getMenuInflater().inflate()用于把刚刚写过的item_menu与系统菜单menu对象绑定在一起,这样菜单中显示的就是刚刚咱们写的item_menu的布局,此方法会被系统自动调用
//选项菜单,系统会自动调用这两个方法 @Override public boolean onCreateOptionsMenu(Menu menu) { //关联资源,相当于把R.item_menu.xml文件里面的内容加载到menu对象中 getMenuInflater().inflate(R.menu.item_menu, menu); return super.onCreateOptionsMenu(menu); }
-
重写onOptionsItemSelected 此方法用于实现点击菜单中的其中一个item后进行什么样的操作, 此处作演示, 就通知一下item的名称,在点击时此方法会被系统自动调用
//选中后要通知 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { //当选择这个item后,通知 ToastUtil.show(this,item.getTitle().toString()); return super.onOptionsItemSelected(item); }
-
源文件下的values里的theme里的noActionBar删掉否则会不显示,因为和选项的三个点一行的叫做ActionBar
-
运行一下点击右上角菜单(三个点)
整体代码如下:
MenuActivity类(包不一定准确)
package menu; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; 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.EditText; import android.widget.PopupMenu; import com.example.notification.R; import com.example.notification.utils.ToastUtil; public class MenuActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); } //选项菜单,系统会自动调用这两个方法 @Override public boolean onCreateOptionsMenu(Menu menu) { //关联资源,相当于把R.item_menu.xml文件里面的内容加载到menu对象中 getMenuInflater().inflate(R.menu.item_menu, menu); return super.onCreateOptionsMenu(menu); } //选中后要通知 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { //当选择这个item后,通知 ToastUtil.show(this,item.getTitle().toString()); return super.onOptionsItemSelected(item); } }
2.上下文菜单
-
在activity_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="menu.MenuActivity" android:orientation="vertical"> <EditText android:id="@+id/edt_copy" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:hint="复制内容"/> <EditText android:id="@+id/edt_paste" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:hint="粘贴内容" /> </LinearLayout>
-
onCreate方法, registerForContextMenu()方法用于注册上下文菜单,为这两个文本框中注册上下文菜单,之后才能在文本框处长按后出现上下文菜单
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); initViews(); //注册上下文菜单 registerForContextMenu(edt_copy); registerForContextMenu(edt_paste); }
-
initViews方法,注意要将作用域提高到整个类
private void initViews() { edt_copy = findViewById(R.id.edt_copy); edt_paste = findViewById(R.id.edt_paste); }
-
重写onCreateContextMenu方法 此方法用于创建上下文菜单,getMenuInflater().inflate()用于将咱们写的item_menu与系统的上下文菜单menu对象绑定在一起,系统自动调用
//上下文菜单 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { //关联菜单 getMenuInflater().inflate(R.menu.item_menu, menu); super.onCreateContextMenu(menu, v, menuInfo); }
-
重写onContextItemSelected方法 此方法用于实现点击菜单中的其中一个item后进行什么样的操作 ,此处作演示,实现将复制文本框中的内容复制然后粘贴至粘贴文本框
//选中这个上下文菜单中的选项 @Override public boolean onContextItemSelected(@NonNull MenuItem item) { //获取点击item的id int id = item.getItemId(); //获取系统剪切板 ClipboardManager cm = (ClipboardManager) getSystemService((Context.CLIPBOARD_SERVICE)); //选中菜单中的复制 if(id==R.id.file_copy){ //将文本复制到剪切板中 //类似于map形式,key对应复制的内容value (key,value) cm.setPrimaryClip(ClipData.newPlainText("msg",edt_copy.getText().toString())); ToastUtil.show(this,"复制成功"); } //选中菜单中的粘贴 if(id==R.id.file_paste){ //获取剪切板的内容并且粘贴至粘贴文本框 edt_paste.setText(cm.getPrimaryClip().getItemAt(0).getText()); } return super.onContextItemSelected(item); }
-
运行一下,在输入文本框中输入内容,长按后复制,长按粘贴文本框并粘贴
整体代码如下:
MenuActivity类(包不一定准确)
package menu; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; 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.EditText; import android.widget.PopupMenu; import com.example.notification.R; import com.example.notification.utils.ToastUtil; public class MenuActivity extends AppCompatActivity { private EditText edt_copy; private EditText edt_paste; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); initViews(); //注册上下文菜单 registerForContextMenu(edt_copy); registerForContextMenu(edt_paste); } private void initViews() { edt_copy = findViewById(R.id.edt_copy); edt_paste = findViewById(R.id.edt_paste); } //上下文菜单 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.item_menu, menu); super.onCreateContextMenu(menu, v, menuInfo); } //选中这个上下文菜单中的选项 @Override public boolean onContextItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); //获取系统剪切板 ClipboardManager cm = (ClipboardManager) getSystemService((Context.CLIPBOARD_SERVICE)); //选中菜单中的复制 if(id==R.id.file_copy){ //将文本复制到剪切板中 //类似于map形式,key对应复制的内容value (key,value) cm.setPrimaryClip(ClipData.newPlainText("msg",edt_copy.getText().toString())); ToastUtil.show(this,"复制成功"); } //选中菜单中的粘贴 if(id==R.id.file_paste){ //获取剪切板的内容 edt_paste.setText(cm.getPrimaryClip().getItemAt(0).getText()); } return super.onContextItemSelected(item); } }
activity_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="menu.MenuActivity" android:orientation="vertical"> <EditText android:id="@+id/edt_copy" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:hint="复制内容"/> <EditText android:id="@+id/edt_paste" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:hint="粘贴内容" /> </LinearLayout>
3.弹出式菜单
-
在activity_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="menu.MenuActivity" android:orientation="vertical"> <Button android:id="@+id/btn_popupmenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="弹出式菜单" android:textSize="20sp"/> </LinearLayout>
-
onCreate方法 给点击按钮设置事件,事件为弹出菜单
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); initViews(); //给这个按钮设置点击事件 btn_popupmenu.setOnClickListener(V->{ //创建弹出式菜单,点击后在按钮处弹出菜单 PopupMenu popupMenu = new PopupMenu(MenuActivity.this,btn_popupmenu); //关联菜单 popupMenu.getMenuInflater().inflate(R.menu.item_menu,popupMenu.getMenu()); //设置点击事件 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { //点击后通知一下点击的哪一个 @Override public boolean onMenuItemClick(MenuItem item) { ToastUtil.show(MenuActivity.this,item.getTitle().toString()); return false; } }); popupMenu.show(); }); }
-
initViews方法,注意要将作用域提高到整个类
private void initViews() { btn_popupmenu = findViewById(R.id.btn_popupmenu); }
整体代码如下:
MenuActivity类(包不一定准确)
package menu; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; 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.EditText; import android.widget.PopupMenu; import com.example.notification.R; import com.example.notification.utils.ToastUtil; public class MenuActivity extends AppCompatActivity { private Button btn_popupmenu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); initViews(); //给这个按钮设置点击事件 btn_popupmenu.setOnClickListener(V->{ //创建弹出式菜单,点击后在按钮处弹出菜单 PopupMenu popupMenu = new PopupMenu(MenuActivity.this,btn_popupmenu); //关联菜单 popupMenu.getMenuInflater().inflate(R.menu.item_menu,popupMenu.getMenu()); //设置点击事件 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { ToastUtil.show(MenuActivity.this,item.getTitle().toString()); return false; } }); popupMenu.show(); }); } private void initViews() { btn_popupmenu = findViewById(R.id.btn_popupmenu); } }
activity_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="menu.MenuActivity" android:orientation="vertical"> <Button android:id="@+id/btn_popupmenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="弹出式菜单" android:textSize="20sp"/> </LinearLayout>
三合一整体代码如下:
MenuActivity类
package menu;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
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.EditText;
import android.widget.PopupMenu;
import com.example.notification.R;
import com.example.notification.utils.ToastUtil;
public class MenuActivity extends AppCompatActivity {
private EditText edt_copy;
private EditText edt_paste;
private Button btn_popupmenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
initViews();
//注册上下文菜单
registerForContextMenu(edt_copy);
registerForContextMenu(edt_paste);
//给这个按钮设置点击事件
btn_popupmenu.setOnClickListener(V->{
//创建弹出式菜单,点击后在按钮处弹出菜单
PopupMenu popupMenu = new PopupMenu(MenuActivity.this,btn_popupmenu);
//关联菜单
popupMenu.getMenuInflater().inflate(R.menu.item_menu,popupMenu.getMenu());
//设置点击事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
ToastUtil.show(MenuActivity.this,item.getTitle().toString());
return false;
}
});
popupMenu.show();
});
}
private void initViews() {
edt_copy = findViewById(R.id.edt_copy);
edt_paste = findViewById(R.id.edt_paste);
btn_popupmenu = findViewById(R.id.btn_popupmenu);
}
//选项菜单,系统会自动调用这两个方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//关联资源,相当于把R.item_menu.xml文件里面的内容加载到menu对象中
getMenuInflater().inflate(R.menu.item_menu, menu);
return super.onCreateOptionsMenu(menu);
}
//选中后要通知
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
//当选择这个item后,通知
ToastUtil.show(this,item.getTitle().toString());
return super.onOptionsItemSelected(item);
}
//上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.item_menu, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
//选中这个上下文菜单中的选项
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
//获取系统剪切板
ClipboardManager cm = (ClipboardManager) getSystemService((Context.CLIPBOARD_SERVICE));
//选中菜单中的复制
if(id==R.id.file_copy){
//将文本复制到剪切板中
//类似于map形式,key对应复制的内容value (key,value)
cm.setPrimaryClip(ClipData.newPlainText("msg",edt_copy.getText().toString()));
ToastUtil.show(this,"复制成功");
}
//选中菜单中的粘贴
if(id==R.id.file_paste){
//获取剪切板的内容
edt_paste.setText(cm.getPrimaryClip().getItemAt(0).getText());
}
return super.onContextItemSelected(item);
}
}
activity_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="menu.MenuActivity"
android:orientation="vertical">
<EditText
android:id="@+id/edt_copy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:hint="复制内容"/>
<EditText
android:id="@+id/edt_paste"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:hint="粘贴内容" />
<Button
android:id="@+id/btn_popupmenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="弹出式菜单"
android:textSize="20sp"/>
</LinearLayout>
item_menu XML文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/file" android:title="文件">
<menu>
<item android:id="@+id/file_copy" android:title="复制"/>
<item android:id="@+id/file_paste" android:title="粘贴"/>
</menu>
</item>
<item android:id="@+id/edit" android:title="编辑"/>
<item android:id="@+id/view" android:title="视图"/>
</menu>