Menu:
3.0以前用户点击底部菜单按钮菜单内容出现在底部
3.0以后选项菜单的项目出现在操作栏中,用户可以使用操作栏右边的图标或者菜单键操作溢出菜单
三大菜单:
选项菜单(OptionMenu)
在res文件夹右键创建AndroidResourceDirectory
选择Menu再右键menu新建menu Resourcefile
<item
android:title="保存"
/>
<item
android:title="设置"
/>
<item android:title="更多操作" >
<menu >
<item android:title="子菜单1" />
<item android:title="子菜单2" />
<item android:title="子菜单3" />
</menu>
</item>
嵌套时要用menu包裹item
但只能嵌套一层
package com.example.mmenudemo;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override//创建optionMenu
public boolean onCreateOptionsMenu(Menu menu) {
//加载菜单资源到当前菜单
getMenuInflater().inflate(R.menu.option, menu);
return true;
}
@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:
Toast.makeText(this, "tuichu", Toast.LENGTH_SHORT).show();
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
@Override//创建optionMenu
public boolean onCreateOptionsMenu(Menu menu) {
//加载菜单资源到当前菜单
getMenuInflater().inflate(R.menu.option,menu );
return true;//必须返回true不然不显示
}
使用该方法就可加载菜单
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: Toast.makeText(this, "tuichu", Toast.LENGTH_SHORT).show(); finish(); break;//default: super.onOptionsItemSelected(item);最好写上 } return super.onOptionsItemSelected(item);//最好返回true }
获取点了那个菜单选项并进行相应操作
常用属性
app:showAsAction=""always一直显示方便使用配合android:icon=""可直接在标题栏显示图标
always|with Text显示图标和中文/never不显示/collapseActionView折叠通常结合ifRoom(有空间时)
android:id
上下文菜单(ContextMenu)
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //ContextMenu演示 //注册,固定显示在某个view下 registerForContextMenu(findViewById(R.id.ContextMenu)); //创建覆盖onCreateContextMenu //菜单项的操作 }
@Override//加载资源 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.context,menu); }
//菜单项的操作
@Override public boolean onContextItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.deelete: Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show(); break; case R.id.rename: Toast.makeText(this, "重命名", Toast.LENGTH_SHORT).show(); break; case R.id.caozuo1: Toast.makeText(this, "caozuo1", Toast.LENGTH_SHORT).show(); break; case R.id.caozuo2: Toast.makeText(this, "caozuo2", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); }
另一种方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//4.为按钮设置上下文操作模式
//4.1实现ActionMode CallBack接口
//4.2在View的长按事件中去启动上下文操作模式
findViewById(R.id.ContextMenu).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
startActionMode(cb);
return false;
}
});
}
ActionMode.Callback cb= new ActionMode.Callback() {
@Override//创建方法,在启动上下文操作模式()startActionMode时调用
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
Log.e("tag","qidong");
getMenuInflater().inflate(R.menu.context,menu);
return true;
}
@Override//准备,在创建方法后调用
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
Log.e("tag","准备");
return false;
}
@Override//点击了那些菜单项
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
Log.e("tag","点击");
switch (menuItem.getItemId()) {
case R.id.deelete:
Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
break;
case R.id.rename:
Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_SHORT).show();
break;
case R.id.caozuo1:
Toast.makeText(MainActivity.this, "caozuo1", Toast.LENGTH_SHORT).show();
break;
case R.id.caozuo2:
Toast.makeText(MainActivity.this, "caozuo2", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
@Override//上下文操作结束时调用
public void onDestroyActionMode(ActionMode actionMode) {
Log.e("tag","结束");
}
};
弹出菜单(PopupMenu)
package com.example.mymenudemo2;
import androidx.annotation.BoolRes;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Button optionMenu = findViewById(R.id.optionMenu);
Button context = findViewById(R.id.contextMenu);
registerForContextMenu(context);
//第二种
/* findViewById(R.id.contextMenu).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
startActionMode(cb);
return false;
}
});*/
//popMenu弹出菜单
final Button button = findViewById(R.id.popupMenu);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//实例化popupMenu对象 ///上下文环境, View的实例化对象出现在谁的旁边
PopupMenu menu=new PopupMenu(MainActivity.this,button);
//加载资源,将1参绑定到2
menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu());
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.popup1:
Toast.makeText(MainActivity.this,"popup1",Toast.LENGTH_SHORT).show();
break;
case R.id.popup2:
Toast.makeText(MainActivity.this,"popup2",Toast.LENGTH_SHORT).show();
break;
}
return false;
}
});
menu.show();
}
});
}
//----------------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.option, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.option1:
Toast.makeText(this, "option1", Toast.LENGTH_SHORT).show();
Log.d("va", "fava");
break;
case R.id.option2:
Toast.makeText(this, "option2", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
//---------------------------------------------------
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context, menu);
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.context1:
Toast.makeText(MainActivity.this,"context1",Toast.LENGTH_SHORT).show();
break;
case R.id.context2:
Toast.makeText(MainActivity.this,"context2",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
/*context第二种
ActionMode.Callback cb=new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
getMenuInflater().inflate(R.menu.context,menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.context1:
Toast.makeText(MainActivity.this,"context1",Toast.LENGTH_SHORT).show();
break;
case R.id.context2:
Toast.makeText(MainActivity.this,"context2",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
};*/
}
首先findViewById获取Button但必须为final型
设置监听事件button.setOnclickListener(
(new View.OnClickListener() {
//1实例化一个popmenu对象 /上下文环境/View的实例化对象被锚定的View菜单出现在谁的下边 PopupMenu menu = new PopupMenu(MainActivity.this, button); //2加载资源,利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中 //将R.menu.*对应的菜单资源加载到弹出式菜单中即将第一个参数的资源加载到第二个参数中 menu.getMenuInflater().inflate(R.menu.popupmenu, menu.getMenu()); // 3为popMenu设置点击监听器 menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.b1: Toast.makeText(MainActivity.this, "b1", Toast.LENGTH_LONG).show(); break; case R.id.b2: Toast.makeText(MainActivity.this, "b2", Toast.LENGTH_LONG).show(); break; case R.id.b3: Toast.makeText(MainActivity.this, "b3", Toast.LENGTH_LONG).show(); break; case R.id.b4: Toast.makeText(MainActivity.this, "b4", Toast.LENGTH_LONG).show(); break; } return false; } }); //4.最容易忘记的一步 menu.show();//显示
});
java代码实现OptionMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//xml资源设置menu
// getMenuInflater().inflate(R.menu.option, menu);
//纯java设计Menu
//Menu
//subMenu
/*
设置
更多
添加
删除*/
//参数1组id参数2菜单项id参数3序号参数4设置
menu.add(1,1,1,"设置");
SubMenu sub =menu.addSubMenu(1,2,2,"更多");
sub.add(2,3,1,"添加");
sub.add(2,4,2,"删除");
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
/* case R.id.option1:
Toast.makeText(this, "option1", Toast.LENGTH_SHORT).show();
break;
case R.id.option2:
Toast.makeText(this, "option2", Toast.LENGTH_SHORT).show();
break;*/
case 1:
Toast.makeText(this, "设置", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "更多", Toast.LENGTH_SHORT).show();
break;
case 3 :
Toast.makeText(this, "添加", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}