基本概念:
菜单:在应用程序中有很多类型的通用应用程序组件
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; } }