showAsAction属性值 always:直接在标题栏显示 never:不显示 withText:控制图标和文本一起显示 ifRoom:有空间就显示
<?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"> <item android:id="@+id/save" android:title="保存" app:showAsAction="always" /> <item android:id="@+id/setting" android:title="设置" /> <item android:title="更多"> <menu> <item android:id="@+id/exit" android:title="退出" /> <item android:title="子菜单1" /> </menu> </item> </menu>实现起来相对比较容易,在选中方法里直接用switch来判断用户点击的是哪一个选项
//创建OptionMenu @Override public boolean onCreateOptionsMenu(Menu menu) { //加载菜单资源 getMenuInflater().inflate(R.menu.option, menu); return true; } //OptionMenu菜单项的选中方法 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.save: Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show(); break; case R.id.setting: Toast.makeText(this, "设置", Toast.LENGTH_SHORT).show(); break; case R.id.exit: finish(); break; } return super.onOptionsItemSelected(item); }这里绑定的是ctx_btn 长按ctx_btn效果
先在onCreate方法中进行注册,绑定某个view
registerForContextMenu(findViewById(R.id.ctx_btn));创建 覆盖onCreateContextMenu方法
//创建ContextMenu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.context, menu); }菜单项的操作 覆盖onContextItemSelected方法
//Context菜单的操作 @Override public boolean onContextItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.delete: Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show(); break; case R.id.rename: Toast.makeText(this, "重命名", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); }长按ctx_btn效果
实现ActionMode.CallBack方法,并传给对象cb
ActionMode.Callback cb = new ActionMode.Callback() { //创建,在启动上下文模式(startActionMode(Callback))时调用 @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { //这里要返回true Log.e("TAG", "创建"); getMenuInflater().inflate(R.menu.context, menu); return true; } //在创建方法后调用 @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { Log.e("TAG", "准备"); return false; } //点击时调用 @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { //这里同样要返回true Log.e("TAG", "点击"); switch (item.getItemId()) { case R.id.delete: Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show(); break; case R.id.rename: Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_SHORT).show(); break; } return true; } //上下文操作模式结束时调用 @Override public void onDestroyActionMode(ActionMode mode) { Log.e("TAG", "结束"); } };在onCreate方法中通过长按监听器启动上下文操作模式
findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { startActionMode(cb); return false; } });点击popBtn效果