首先区分一下什么是选项菜单,什么是快捷菜单。
选项菜单是针对整个页面布局的,在这个页面布局的右上方,点击之后可以会展开选项,供大家选择。
快捷菜单正如其名,十分方便,因为他可以依赖于任何控件,定义之后只需要长摁此控件,菜单列表就会出现,如右:
定义选项菜单和快捷菜单都是有两种方法,一种是直接在activity文件中代码书写,这种方法相对比较繁琐,但是灵活性更高。还有一种是通过菜单布局文件直接定义。但是和之前所有的控件相同,要实现效果都要在activity中书写。
1.选项菜单:
1.1.使用菜单布局文件实现的选项菜单
首先在res文件中创建文件夹menu,在文件内写出菜单布局文件submeun.xml:
然后在MainActivity中实例化这个菜单,代码如下:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
//实例化菜单
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.submenu ,menu);
return true;
}
1.2.在activity中直接创建选项菜单,在MainActivity写如下代码:
//定义菜单项常量
final static int MENU_ADD = Menu.FIRST;
final static int MENU_SAVE = Menu.FIRST + 1;
final static int MENU_DELETE = Menu.FIRST + 2;
final static int MENU_ADDUSER = Menu.FIRST + 3;
final static int MENU_ADDDOCUMENT = Menu.FIRST + 4;
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
//添加菜单项
SubMenu sub = menu.addSubMenu(0, MENU_ADD, 0, "添加").setIcon(R.drawable.add);
//menu.add(0, MENU_ADD, 0, "添加").setIcon(R.drawable.add);
sub.add(0,MENU_ADDUSER,0,"添加用户").setIcon(R.drawable.user);
sub.add(0,MENU_ADDDOCUMENT,1,"添加文档").setIcon(R.drawable.doc);
menu.add(0,MENU_SAVE,2,"保存").setIcon(R.drawable.save);
menu.add(0,MENU_DELETE,1,"删除").setIcon(R.drawable.delete);
return true;
}
1.3怎么给这些选项设置点击事件呢?代码如下:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD: //如果是用菜单布局文件写的,应该改为case R.id.menu_add
Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
isSaved=false;
break;
case MENU_SAVE:
Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_SHORT).show();
isSaved=true;
break;
case MENU_DELETE:
Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
break;
case MENU_ADDUSER:
Toast.makeText(MainActivity.this, "添加用户", Toast.LENGTH_SHORT).show();
break;
case MENU_ADDDOCUMENT:
Toast.makeText(MainActivity.this, "添加文档", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
1.4我们看到的public boolean onCreateOptionsMenu(Menu menu){}函数,只对菜单初始化一次,那么当外界有些事情触发引起菜单的改变,该怎么设置呢?我们有专门的初始化函数,代码如下:
//记录保存状态
private boolean isSaved=false;
//动态修改菜单项
@Override
public boolean onPrepareOptionsMenu(Menu menu){
MenuItem item=menu.findItem(MENU_SAVE);
if (isSaved){
item.setTitle("Save");
item.setEnabled(false); //设置能否点击
}
else{
item.setTitle("Save*");
item.setEnabled(true);
}
return true;
}
2.快捷菜单
2.1.使用菜单布局文件实现的选项菜单
菜单布局文件直接使用上面那个,下面直接看实例化菜单代码,你会发现其实差不多:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txt=(TextView)findViewById(R.id.txtTest);
registerForContextMenu(txt); //把快捷菜单绑定到这个文本控件上
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//实例化菜单代码
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.submenu ,menu);
}
2.2.在activity中直接创建快捷菜单,在MainActivity写如下代码:
//定义菜单项常量
final static int MENU_ADD = Menu.FIRST;
final static int MENU_SAVE = Menu.FIRST + 1;
final static int MENU_DELETE = Menu.FIRST + 2;
final static int MENU_ADDUSER = Menu.FIRST + 3;
final static int MENU_ADDDOCUMENT = Menu.FIRST + 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txt=(TextView)findViewById(R.id.txtTest);
registerForContextMenu(txt); //绑定菜单
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
SubMenu sub = menu.addSubMenu(0, MENU_ADD, 0, "添加").setIcon(R.drawable.add);
sub.add(0,MENU_ADDUSER,0,"添加用户").setIcon(R.drawable.user);
sub.add(0,MENU_ADDDOCUMENT,1,"添加文档").setIcon(R.drawable.doc);
menu.add(0, MENU_SAVE, 2, "保存").setIcon(R.drawable.save);
menu.add(0, MENU_DELETE, 1, "删除").setIcon(R.drawable.delete);
}
快捷菜单每次从新点击控件之后都会初始化,所以不需要像上面的public boolean onPrepareOptionsMenu(Menu menu){}函数,初始化内容直接写在creat代码里即可。
2.3怎么给这些选项设置点击事件呢?代码和上面差不多,就是函数名不同,代码如下:
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD:
Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
isSaved=false;
break;
case MENU_SAVE:
Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_SHORT).show();
isSaved=true;
break;
case MENU_DELETE:
Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
break;
case MENU_ADDUSER:
Toast.makeText(MainActivity.this, "添加用户", Toast.LENGTH_SHORT).show();
break;
case MENU_ADDDOCUMENT:
Toast.makeText(MainActivity.this, "添加文档", Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
好了,今天就介绍到这,代码在这里:https://download.csdn.net/download/qq_38367681/10803684