Tips: 选项菜单出现在标题栏右侧,如果设置了无标题栏那就看不见了
Tips:菜单项可以提前写好引用,也可以动态生成,下面步骤包含两种实现方式
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item1"
android:title="@string/String1" />
<item
android:id="@+id/item2"
android:title="@string/String2" />
menu>
/**
* create by 星航指挥官
* create on 2020/8/24
* 我为天帝 当镇压世间一切敌
* 遮天
*/
public class OptionsMenuActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_optionsmenu);
}
/*
* 重写onCreateOptionsMenu()方法
* 将菜单项显示出来
* */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/*
* 通过getMenuInflater()方法得到MenuInflater对象
* 再调用它的inflater()方法给当前活动创建菜单
* 该方法有两个参数
* 第一个参数用于指定我们通过哪一个资源文件来创建菜单
* 第二个参数用于指定我们的菜单项将添加到哪一个Mune对象当中,这里使用传入的menu参数
* */
getMenuInflater().inflate(R.menu.main,menu);
/*
*如果没有在res/menu目录下创建main.xml
* 也可用add()方法动态添加菜单项
* menu.add(groupId,itemId,order,title)
* groupId 分组ID;itemId 菜单项ID;order 排序;title 菜单名称;
* 该方法返回一个Item,可以重新修改titel,也可以设置图标 但是API>=11不会显示
* */
MenuItem item = menu.add(1, 100, 1, "菜单项");
item.setTitle("动态生成的菜单项1");
menu.add(2, 101, 2, "动态生成的菜单项2");
return true;
/*
* 然后给这个方法返回true,表示允许创建的菜单显示出来了
* 如果返回为false,创建的菜单将无法显示
* */
}
/*
* 仅仅显示出来不够
* 我们还要给菜单项添加点击事件
* 重写onOptionsItemSelected()方法定义点击事件
* */
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.item1:
Toast.makeText(this,R.string.String1,Toast.LENGTH_SHORT).show();
break;
case R.id.item2:
Toast.makeText(this,R.string.String2,Toast.LENGTH_SHORT).show();
break;
case 100:
Toast.makeText(this,"动态生成的菜单项1",Toast.LENGTH_SHORT).show();
break;
case 101:
Toast.makeText(this,"动态生成的菜单项2",Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
将功能相同的操作分组显示,作用在OptionsMenu上,是OptionsMenu的二级菜单
/**
* create by 星航指挥官
* create on 2020/8/24
* 我为天帝 当镇压世间一切敌
* 遮天
*/
public class SubMenuActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_submenu);
}
/*
* 重写onCreateOptionsMenu()方法
* 将菜单项显示出来
* */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//使用addSubMenu()方法创建两个分组
SubMenu Menu1 = menu.addSubMenu("分组一");
SubMenu Menu2 = menu.addSubMenu("分组二");
/*
* 使用SubMenu.add()方法动态添加子菜单项
* SubMenu.add(groupId,itemId,order,title)
* groupId 分组ID;itemId 子菜单项ID;order 排序;title 子菜单名称;
* */
Menu1.add(1, 1, 1, "选项1");
Menu1.add(1, 2, 1, "选项2");
Menu1.add(1, 3, 1, "选项3");
Menu2.add(2, 1, 1, "选项4");
Menu2.add(2, 2, 1, "选项5");
Menu2.add(2, 3, 1, "选项6");
return true;
}
/*
* 仅仅显示出来不够
* 我们还要给菜单项添加点击事件
* 重写onOptionsItemSelected()方法定义点击事件
* */
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
/*
* 先判断分组ID
* 再判断子菜单项的ID
* */
if (item.getGroupId() == 1) {
switch (item.getItemId()) {
case 1:
Toast.makeText(this, "选项1", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "选项2", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "选项3", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
} else if (item.getGroupId() == 2) {
switch (item.getItemId()) {
case 1:
Toast.makeText(this, "选项4", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "选项5", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "选项6", Toast.LENGTH_SHORT).show();
break;
}
}
return super.onOptionsItemSelected(item);
}
}
当用户长按Activity页面时,弹出的菜单称为上下文菜单。
ContextMenu与OptionMenu的区别:
1、OptionMenu对应的是activity,一个activity只能拥有一个选项菜单;
2、ContextMenu对应的是view,每个view都可以设置上下文菜单;
3、ContextMenu常用于ListView或者GridView
大致分为两步,
1.创建listview并给listview注册上下文菜单
2.设置ContextMenu菜单项以及对应的响应事件
/**
* create by 星航指挥官
* create on 2020/8/24
* 我为天帝 当镇压世间一切敌
* 遮天
*/
public class ContextMenuActivity extends AppCompatActivity {
private static final String TAG = "ContextMenuActivity";
@BindView(R.id.listview)
ListView listview;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载视图
setContentView(R.layout.activity_contextmenu);
//注解工具
ButterKnife.bind(this);
initview();
}
/*
* 第一步,给listview设置适配器
* 并注册上下文菜单
* */
private void initview() {
/*
*创建适配器
* ArrayAdapter(数组适配器),最为基础简单的适配器,只能显示一行文字
* 第一个参数是上下文对象
*第二个参数是显示的item的样式,android已经定义好,可直接使用,也可使用自定义的TextView
* 第三个参数是要显示的数据
* tem的样式:
*simple_list_item_1:单独的一行文本框
*simple_list_item_2:有两个文本框组成
*simple_list_item_checked每项都是由一个已选中的列表项
*simple_list_item_multiple_choice:都带有一个复选框
*simple_list_item_single_choice:都带有一个单选框
* */
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new String[]{"劫过九重城关", "我坐下马正酣"});
//listview设置适配器为adapter
listview.setAdapter(adapter);
//给listview注册上下文菜单
//可别忘了
this.registerForContextMenu(listview);
}
/**
* 第二步重写onCreateContextMenu()方法添加上下文菜单的菜单项
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//设置标题
menu.setHeaderTitle("ContextMenu");
//设置图标
menu.setHeaderIcon(R.mipmap.shuguang);
//add()方法添加菜单项,参数介绍参考OptionMenu
menu.add(1, 1, 1, "已读");
menu.add(1, 2, 2, "删除");
}
/**
* 第三步重写onContextItemSelected()方法创建单击事件
*/
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
// 得到当前被选中的item信息
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Log.i(TAG, "context item seleted ID="+ menuInfo.id);
switch (item.getItemId()) {
case 1:
Toast.makeText(this, ("第"+menuInfo.id+"项已读"), Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, ("第"+menuInfo.id+"项删除"), Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
}
kee