基本概念:
菜单:在应用程序中有很多类型的通用应用程序组件
A.选项菜单(OptionsMenu):当用户按手机上的菜单键时自动弹出的菜单
onCreateOptionsMenu(Menu menu):初始化菜单项时自动调用的方法
onOptionsItemSelected(MenuItem item):当处理用户点击菜单项时自动调用的方法
B.上下文菜单(contextMenu):长按某个控件超过2s后弹出的菜单
C.弹出菜单(PopMenu):当用户点击某个控件时弹出的菜单
A.选项菜单
实际效果:
控制台反馈:
实现方式:
<1>用java代码来实现
实例代码:
package com.hsj.example.menudemo01;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;
/**
*
*/
public class MainActivity extends AppCompatActivity {
private static final int MENU_FILE = Menu.FIRST+100;
private static final int MENU_FILE_NEW = Menu.FIRST+50;
private static final int MENU_FILE_OPEN = Menu.FIRST+25;
private static final int MENU_EDIT = Menu.FIRST+200;
private static final int MENU_VIEW = Menu.FIRST+300;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
*
* 创建选项菜单时自动调用的方法
* @param menu 菜单栏对象
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//通过java 代码生成一级菜单项:menu.add(groupid,itemId,orderId,title)
//menu.add(1,MENU_FILE,100,"文件");
//通过java 代码生成二级菜单
SubMenu subMenu_file=menu.addSubMenu("文件");//指定顶级菜单项的标题并返回二级菜单对象
subMenu_file.add(1,MENU_FILE_NEW,100,"新建");
subMenu_file.add(1,MENU_FILE_OPEN,200,"打开");
menu.add(1,MENU_EDIT,200,"编辑");
menu.add(1,MENU_VIEW,300,"查看");
System.out.println("=====onCreateOptionsMenu(Menu menu)====");
return super.onCreateOptionsMenu(menu);
}
/**
* 当用户点击菜单项时自动调用的方法
* @param item 用户点中的菜单项对象
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
String title=item.getTitle().toString();
Toast.makeText(this,"title="+title,Toast.LENGTH_LONG).show();
System.out.println("==onOptionsItemSelected(MenuItem item="+item+")===");
int itemId=item.getItemId();
switch (itemId){
case MENU_FILE:
System.out.println("===文件==");
break;
case MENU_FILE_NEW:
System.out.println("===新建====");
break;
case MENU_FILE_OPEN:
System.out.println("==打开===");
break;
case MENU_EDIT:
System.out.println("====编辑====");
break;
case MENU_VIEW:
System.out.println("===查看===");
}
return super.onOptionsItemSelected(item);
}
}
<2>用布局填充器(关联xml)来实现
具体操作:新建一个menu文件
实例代码:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<!--
android:id="@+id/menu_file":指定菜单项的唯一标识
android:title="File":菜单项上显示的文字,即菜单标题
android:orderInCategory="300":指定菜单在类别中的排序号,数字越大越靠近手机底部
android:enabled="false":指定菜单项是否可用,true:可用,false:不可用,所谓不可用就是菜单项变灰,不再响应用户的点击操作了
app:showAsAction="always":指定菜单项的显示方式;always:让菜单项永远显示在ActionBar 上
app:showAsAction="ifRoom":如果ActionBar 上有剩余空间则显示在ActionBar 上,否则隐藏才菜单条中
app:showAsAction="never":当前<span class=""></span>菜单项永远不会显示在ActionBar 上
android:icon="@mipmap/ic_launcher":指定菜单项显示的图标
app:showAsAction="always|withText":当前菜单项永远显示在ActionBar 上并且伴随着显示菜单的标题,但是必须在横屏上才能同时显示,竖屏则只显示图标
-->
<item
android:id="@+id/menu_file"
android:orderInCategory="300"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:title="File">
<menu>
<item android:id="@+id/menu_new" android:title="新建">
<menu>
<item android:title="新建word 文件"></item>
<item android:title="新建pdf 文件"></item>
</menu>
</item>
<item android:id="@+id/menu_open" android:title="打开"/>
<item android:id="@+id/menu_close" android:title="关闭"/>
</menu>
</item>
<item
android:id="@+id/menu_edit"
android:orderInCategory="200"
app:showAsAction="ifRoom"
android:title="Edit">
</item>
<item
android:id="@+id/menu_view"
android:orderInCategory="100"
app:showAsAction="never"
android:title="View">
</item>
</menu>
后台逻辑:
package com.hsj.example.menudemo01;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
/**
* 菜单:在应用程序中有很多类型的通用应用程序组件
* 菜单的分类:
* A: 选项菜单(OptionsMenu):当用户按手机上的菜单键时弹出的菜单
* onCreateOptionsMenu(Menu menu):初始化菜单项时自动调用的方法
* onOptionsItemSelected(MenuItem item):当处理用户点击菜单项时自动调用的方法
*
*
* B:上下文菜单(ContextMenu):长按某个控件超过2s 后弹出的菜单
*
* C:弹出菜单(PopMenu):当用户点击某个控件时弹出的菜单
*
*/
public class MainActivity_bak01 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
*
* 布局填充器:将布局文件转换成View 对象
*
* 创建选项菜单时自动调用的方法
* @param menu 菜单栏对象
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//1.得到菜单填充器对象:将菜单文件转换成菜单对象并挂载到指定的菜单栏上
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.menu_main,menu);
System.out.println("=====onCreateOptionsMenu(Menu menu)====");
return super.onCreateOptionsMenu(menu);
}
/**
* 每次展开菜单项时都会自动调用的方法,可以修改某些菜单的可用性
* @param menu
* @return
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
//根据菜单项的id 值查找菜单对象
MenuItem menuItem_view=menu.findItem(R.id.menu_view);
//设置菜单项的可用性
//menuItem_view.setEnabled(false);//禁用菜单项
//设置菜单项的可见性
menuItem_view.setVisible(false);//菜单性不可见
System.out.println("===onPrepareOptionsMenu(Menu menu)==");
return super.onPrepareOptionsMenu(menu);//如果想显示菜单项,则当前方法必须返回true
//return false;//不会显示任何菜单对象了
}
/**
* 当用户点击菜单项时自动调用的方法
* @param item 用户点中的菜单项对象
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
System.out.println("==onOptionsItemSelected(MenuItem item="+item+")===");
//得到菜单项的标题
String title=item.getTitle().toString();
Toast.makeText(this,"title="+title,Toast.LENGTH_LONG).show();
int menuItemId= item.getItemId();
switch (menuItemId){
case R.id.menu_file:
System.out.println("=====file====");
break;
case R.id.menu_edit:
System.out.println("====edit=======");
break;
case R.id.menu_view:
System.out.println("===view====");
break;
}
return super.onOptionsItemSelected(item);
}
B.上下文菜单:
contextMenu:
将指定内容复制到剪切板的步骤:
1.通过系统服务得到剪切板管理器对象
this.cliphboardManager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
2.得到需要剪切的内容对象
clipData = ClipData.newPlainText("text",itemContent);
3.使用剪切板管理器对象设置需要复制的剪切内容对象
clipboardManager.setPrimaryClip(clipData);
将复制的内容粘贴到指定位置:
1.通过剪切板管理器对象得到复制上的内容对应的对象
clipData = clipboardManager.getPrimaryClip();
2.通过剪切对象得到粘贴的条目对象
item1 = clipData.getItemAt(0)
3.得到复制到剪切板上的内容
content = item1.getText().toString();
业务逻辑代码:
package com.hsj.example.contextmenudemo02;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
*将指定内容复制到剪切板的步骤:
* 1.通过系统服务得到剪贴板管理器对象
* this.clipboardManager= (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
* 2.得到需要剪贴的内容对象
* clipData=ClipData.newPlainText("text",itemContent);
* 3.使用剪切板管理器对象设置需要复制的剪贴内容对象
clipboardManager.setPrimaryClip(clipData);
将复制的内容粘贴到指定位置:
1.通过剪贴板管理器对象得到复制上的内容对应的对象
clipData=clipboardManager.getPrimaryClip();
2.通过剪切对象得到粘贴的条目对象
item1=clipData.getItemAt(0);
3.得到复制到剪切板上的内容
content=item1.getText().toString();
*/
public class MainActivity extends AppCompatActivity {
private static final int MENU_FILE = Menu.FIRST + 100;
private static final int MENU_FILE_NEW = Menu.FIRST + 50;
private static final int MENU_FILE_OPEN = Menu.FIRST + 25;
private static final int MENU_EDIT = Menu.FIRST + 200;
private static final int MENU_EDIT_COPY = Menu.FIRST + 150;
private static final int MENU_EDIT_PASTE = Menu.FIRST + 125;
private static final int MENU_VIEW = Menu.FIRST + 300;
private ListView listView_names;
private List<String> data;
private ArrayAdapter<String> adapter;
//声明剪贴板管理器对象
private ClipboardManager clipboardManager;
//声明剪辑对象
private ClipData clipData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.通过系统服务得到剪贴板管理器对象
this.clipboardManager= (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
this.listView_names= (ListView) this.findViewById(R.id.listView_names);
this.adapter=this.getAdapter();
this.listView_names.setAdapter(adapter);
//注册上下文菜单到ListView 控件上
registerForContextMenu(this.listView_names);
}
private ArrayAdapter<String> getAdapter() {
this.data=this.getData();
adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
return adapter;
}
private List<String> getData() {
data=new ArrayList<>();
for(int i=0;i<20;i++){
data.add("小丽"+i);
}
return data;
}
/**
* 初始化上下文菜单对象时自动地哦啊哟的方法
* @param menu
* @param v
* @param menuInfo
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
//getMenuInflater().inflate(R.menu.menu_context,menu);
menu.add(1,MENU_VIEW,100,"查看条目内容");
menu.add(1,MENU_EDIT_COPY,200,"复制");
menu.add(1,MENU_EDIT_PASTE,300,"粘贴");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// String title=item.getTitle().toString();
//Toast.makeText(this,"title="+title,Toast.LENGTH_LONG).show();
int itemId=item.getItemId();
//调用菜单对象的getMenuInfo()方法得到上下文菜单信息对象ContextMenuInfo并转换成它的子类AdapterContextMenuInfo
AdapterView.AdapterContextMenuInfo adapterContextMenuInfo= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
//用户长按的条目对应的索引值
int position= adapterContextMenuInfo.position;
String itemContent=data.get(position);
ClipData.Item item1=null;
String content=null;
switch (itemId){
case MENU_VIEW:
Toast.makeText(this,"itemContent="+itemContent,Toast.LENGTH_LONG).show();
System.out.println("===查看===");
break;
case MENU_EDIT_COPY:
//完成复制操作
clipData=ClipData.newPlainText("text",itemContent);
clipboardManager.setPrimaryClip(clipData);
/*//完成粘贴操作
clipData=clipboardManager.getPrimaryClip();//通过剪贴板管理器对象得到复制上的内容对应的对象
item1=clipData.getItemAt(0);//通过剪切对象得到粘贴的条目对象
content=item1.getText().toString();//得到复制到剪切板上的内容
Toast.makeText(this,"content="+content,Toast.LENGTH_LONG).show();
*/
System.out.println("===复制===");
break;
case MENU_EDIT_PASTE:
//完成粘贴操作
clipData=clipboardManager.getPrimaryClip();//通过剪贴板管理器对象得到复制上的内容对应的对象
item1=clipData.getItemAt(0);//通过剪切对象得到粘贴的条目对象
content=item1.getText().toString();//得到复制到剪切板上的内容
Toast.makeText(this,"content="+content,Toast.LENGTH_LONG).show();
System.out.println("===粘贴===");
break;
}
return super.onContextItemSelected(item);
}
}
C.弹出菜单
实例代码:
package com.hsj.example.popupmenudemo03;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;
/**
* 弹出菜单:当用户点击某个View 时弹出的菜单.
*
* 使用剪贴板完成复制和粘贴效果的步骤:
* 1.通过系统服务得到剪切板管理器对象
* 2.调用剪切板管理器对象的setPrimaryClip()方法设置需要复制的数据对象
*
*/
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
private static final int MENU_EDIT_COPY = Menu.FIRST+100;
private static final int MENU_EDIT_PASTE = Menu.FIRST+200;
private ClipboardManager clipboardManager;
private String content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.通过系统服务得到剪切板管理器对象
this.clipboardManager= (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
}
public void popup(View view){
Button button= (Button) view;
content=button.getText().toString();
//1.实例化弹出菜单对象,指定上下文对象和绑定的 view 对象
PopupMenu popupMenu=new PopupMenu(this,view);
popupMenu.setOnMenuItemClickListener(this);
popupMenu.getMenuInflater().inflate(R.menu.menu_popup,popupMenu.getMenu());
//2.显示弹出菜单
popupMenu.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
String title=item.getTitle().toString();
Toast.makeText(this, "title="+title, Toast.LENGTH_SHORT).show();
ClipData clipData=null;
//得到菜单项的id 值
int itemId=item.getItemId();
switch (itemId){
case R.id.menu_copy:
clipData=ClipData.newPlainText("text",content);
//2.调用剪切板管理器对象的setPrimaryClip()方法设置需要复制的数据对象
clipboardManager.setPrimaryClip(clipData);
break;
case R.id.menu_paste:
//3.粘贴复制到剪切板管理器上的数据对象
clipData=clipboardManager.getPrimaryClip();
ClipData.Item itemData=clipData.getItemAt(0);
String pasteData=itemData.getText().toString();
Toast.makeText(this, "pasteData="+pasteData, Toast.LENGTH_SHORT).show();
break;
}
return false;
}
}