【Android】- UI常用组件 -Menu菜单
- 一、选项菜单OptionMenu(基于Activity)
- 1.重要属性
- 2.一些特点
- 3.设置方法
- 二、选项菜单ContextMenu(基于View)
- 1.重要属性
- 2.一些特点
- 3.设置方法
- 三、浮动菜单PopupMenu(基于View)
- 1.重要属性
- 2.一些特点
- 3.设置方法
- 四、总结
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
【Android】- UI常用组件 -Menu菜单
- 一、选项菜单OptionMenu(基于Activity)
- 1.重要属性
- 2.一些特点
- 3.设置方法
- 二、选项菜单ContextMenu(基于View)
- 1.重要属性
- 2.一些特点
- 3.设置方法
- 三、浮动菜单PopupMenu(基于View)
- 1.重要属性
- 2.一些特点
- 3.设置方法
- 四、总结
一、选项菜单OptionMenu(基于Activity)
点击右上角的点 | 出现菜单 |
1.重要属性
例:
< item android:title="保存"
android:icon="@mipmap/ic_launcher"
app:showAsAction="always|withText"/ >
showAsAction属性控制选项的显示方式。always表示一直显示;never表示不显示;withText表示图标和文本一起显示;ifRoom有空间就显示。
2.一些特点
3.设置方法
①在Android模式的res目录下新建一个Android Resource Directory,Resource Type 选择为menu。新建完后res目录下会有一个新的menu目录,右键menu目录,选择“New Resource File”创建一个菜单页面xml。
②设置这个菜单xml文件,可以直接用标签< menu >和< item >嵌套设置(最多嵌套两层),也可以在design视图拖拽元件实现。需要时给item选项设置id,以便对应的Activity中的函数对用户选择进行处理。
③在对应的Activity中重写onCreateOptionsMenu(Menu menu) 方法。该方法的作用是绑定菜单资源。
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.option,menu);//R.menu.optionius菜单页面xml
return true;
}
④重写onOptionsItemSelected方法。
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.save:
Toast.makeText(this,"保存!",Toast.LENGTH_LONG).show();
break;
case R.id.newone:
Toast.makeText(this,"新建!",Toast.LENGTH_LONG).show();
break;
case R.id.back:
Toast.makeText(this,"回退!",Toast.LENGTH_LONG).show();
break;
case R.id.exit:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
二、选项菜单ContextMenu(基于View)
1.重要属性
2.一些特点
3.设置方法
普通模式:
①在onCreate方法中为一个view注册菜单
registerForContextMenu(findViewById(R.id.btn_content_menu));
②重写onCreateContextMenu方法,将view与菜单绑定
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.option,menu);
}
③重写onContextItemSelected方法,对相应选择进行处理。
上下文操作模式:
①在Activity中实现 ActionMode.Callback接口,并实现其中的方法。在启动上下文操作时调用
ActionMode.Callback db=new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
Toast.makeText(MainActivity.this,"创建!",Toast.LENGTH_LONG).show();
getMenuInflater().inflate(R.menu.option,menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
Toast.makeText(MainActivity.this,"准备!",Toast.LENGTH_LONG).show();
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.save:
Toast.makeText(MainActivity.this,"保存!",Toast.LENGTH_LONG).show();
break;
case R.id.newone:
Toast.makeText(MainActivity.this,"新建!",Toast.LENGTH_LONG).show();
break;
case R.id.back:
Toast.makeText(MainActivity.this,"回退!",Toast.LENGTH_LONG).show();
break;
case R.id.exit:
finish();
break;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
Toast.makeText(MainActivity.this,"结束!",Toast.LENGTH_LONG).show();
}
};
②在onCreate方法中设置view的长按事件,在长按事件中启动上下文操作模式。
findViewById(R.id.btn_content_menu).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
startActionMode(cb);
return false;
}
});
三、浮动菜单PopupMenu(基于View)
1.重要属性
2.一些特点
3.设置方法
例子:点击button弹出PopupMenu菜单以供用户选择
简单来说,完成该例需要
①首先通过findViewById获得触发菜单弹出的view,为这个view设置监听事件。如该例中是一个button,监听事件是弹出菜单以供用户选择,故在监听事件中需要创建菜单(确定出现位置)、绑定菜单资源(确定菜单样式)、完成菜单交互功能(确定选项功能)、显示菜单。
②在监听事件中,首先用“ PopupMenu menu=new PopupMenu(MainActivity.this,btn_popup)”创建一个PopupMenu对象menu,实参为上下文和锚点,这两个参数决定了菜单以什么为参照在什么位置弹出(一般是贴着锚点元件下方弹出)。
再通过“ getMenuInflater().inflate(R.menu.option,menu.getMenu());”将我们制作的菜单样式资源R.menu.option.xml添加到 PopupMenu对象调用getMenu()方法返回的菜单对象中。
然后为PopupMenu对象设置点击事件处理弹出菜单的交互。
最后“ menu.show();”PopupMenu对象调用show方法显示菜单。
final Button btn_popup=findViewById(R.id.btn_popup_menu);//引发菜单出现的相应“入口”View,此处是按钮。
btn_popup.setOnClickListener(new View.OnClickListener() {//监听事件
@Override
public void onClick(View view) {
PopupMenu menu=new PopupMenu(MainActivity.this,btn_popup);//创建一个PopupMenu类对象,确定菜单出现位置
getMenuInflater().inflate(R.menu.option,menu.getMenu());//将菜单样式添加到菜单对象(与optionMenu和ContextMenu不同的是,这个菜单对象通过PopupMenu对象调用getMenu()返回)
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {//为弹出菜单设置监听器处理交互事件
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
selectResult(menuItem);//这是一个处理交互事件的自定义函数,与前面的菜单类似,就是判断menuItem作相应处理
return false;
}
});
menu.show();
}
});
四、总结
1.无论是哪一种菜单都可以通过getMenuInflater().inflate(菜单样式资源,定义的菜单);将菜单样式与具体声明的菜单绑定。
2.OptionMenu是基于Activity的,故而一个Activity只会出现一个OptionMenu,所以Activity中直接重写onCreateOptionsMenu和onOptionsItemSelected方法就能设置菜单。
普通模式的上下文菜单ContentMenu比OptionMenu多一步是在onCreate方法中用“ registerForContextMenu(findViewById(R.id.btn_content_menu));”(R.id.btn_content_menu是触发菜单弹出的响应元件的id)为某个view(包括其派生类)注册上下文菜单,然后重写onCreateContextMenu和onContextItemSelected方法。所以普通模式的上下文菜单尽管可以为多个按钮注册上下文菜单,但它们注册的上下文菜单的样式和交互是同样的,通过重写那两个方法设置的。
而上下文操作模式的上下文菜单是通过在Activity中new一个对象a实现 ActionMode.Callback接口,菜单的实现细节在接口需要重写的方法中,然后在触发菜单的元件的点击监听事件中 startActionMode(a);就行。所以在一个Activity中可以有多个不同的上下文操作模式的上下文菜单。
PopupMenu的设置方法则是在onCreate中给触发菜单的元件设置点击监听事件,在监听事件中定义PopupMenu对象、样式资源和PopupMenu对象绑定、设置菜单交互、显示菜单。
3.onCreateOptionsMenu和onOptionsItemSelected方法都要返回true,表示操作已经完成。在onOptionsItemSelected的switch语句的default标签中可以 写 super.onOptionsItemSelected(item);语句,当没有匹配的结果就可以调用父类进行处理。