老罗视频学习笔记。
一.普通的menu。
在onCreateOptionsMenu函数中为menu添加menu项。
代码如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
//用MenuItem对象来表示添加的menu项,通过MenuItem对象来操作
MenuItem menuItem1 = menu.add(1001, ITEM1, 1, "菜单测试1");
MenuItem menuItem2 = menu.add(1002, ITEM2, 2, "菜单测试2");
//没作用menuItem2.setIcon(R.drawable.t2);
menuItem2.setTitle("菜单2修改后");
return super.onCreateOptionsMenu(menu);
}
当选择了一项menu时,会在onMenuItemSelected或者onOptionsItemSelected回调。
如下即可:
switch (item.getItemId()) {
case ITEM1:
Toast.makeText(MainActivity.this, "点击了菜单1", Toast.LENGTH_SHORT).show();
break;
case ITEM2:
Toast.makeText(MainActivity.this, "点击了菜单2", Toast.LENGTH_SHORT).show();
break;
default:
break;
二.用res->menu->下的xml布局文件来显示menu。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android_menu.MainActivity" >
<!--
android:showAsAction="never"表示不会再标题栏显示
"ifRoom|withText"表示在标题栏有位置的话显示并且显示标题-->
<item
android:id="@+id/sys"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:icon="@drawable/t1"
android:title="系统菜单">
<menu >
<item android:id="@+id/create_new"
android:title="新建文件"/>
<item android:id="@+id/open"
android:title="打开文件"/>
</menu>
</item>
<item
android:id="@+id/user"
android:orderInCategory="101"
android:showAsAction="never"
android:icon="@drawable/t2"
android:title="用户菜单">
<menu >
<group android:id="@+id/group1">
<item android:id="@+id/load"
android:title="加载文件"/>
</group>
<group android:id="@+id/group2">
<item android:id="@+id/save"
android:title="保存文件"/>
</group>
</menu>
</item>
</menu>
onCreateOptionsMenu函数中一句话就可以了
getMenuInflater().inflate(R.menu.main, menu);
布局文件中android:showAsAction="ifRoom|withText"如果是never的话,会在menu键点击时显示,如果为ifRoom会在标题栏显示的,
当选择了一项menu时,会在onMenuItemSelected或者onOptionsItemSelected回调。和上边方法一样。
效果如下:
如果不在标题栏显示:那么点击后会显示在屏幕中心
如果在标题栏显示是这样的
三.上下文菜单,contextMenu
除了上边说的Activity的optionsMenu外,还有一种长按视图后会显示的菜单,叫做contextMenu菜单
就是先在主界面写一个view布局,例如listview。长按其中一项时会弹出menu菜单,但是这个view必须用registerForContextMenu(listView)函数注册上下文。否则无法弹出menu。
在oncreate函数中设置listview。
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView1);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,getData());
listView.setAdapter(arrayAdapter);
//必须要给listview注册上下文菜单
registerForContextMenu(listView);
}
getData函数如下:
public List<String> getData(){
List<String> list = new ArrayList<String>();
for(int i = 0;i<7;i++){
list.add("jack"+i);
}
return list;
}
上下文菜单是用onCreateContextMenu函数来创建的。
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.contentmenu, menu);
}
响应菜单选项是用onContextItemSelected函数实现的。
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.edit:
Toast.makeText(MainActivity.this, "点击了edit", Toast.LENGTH_SHORT).show();
break;
case R.id.save:
Toast.makeText(MainActivity.this, "点击了save", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
效果图如下:
四.ActionModel menu。
长按按钮或者别的控件时 ,会在标题栏提供可以选择的menu。
首先定义一个ActionMode对象。
private ActionMode actionMode;
在oncreate函数中给按钮设置长按点击事件。
actionmodelmenu = (Button)findViewById(R.id.button1);
//给按钮绑定一个长按的点击事件
actionmodelmenu.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
if(actionMode!=null){
return false;
}
actionMode = startActionMode(actionCallback);
v.setSelected(true);
return true;
}
});
上边代码的回调函数如下:
private ActionMode.Callback actionCallback = new ActionMode.Callback() {
@Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
// TODO Auto-generated method stub
return false;
}
//菜单销毁时会调用这个函数,
@Override
public void onDestroyActionMode(ActionMode arg0) {
// TODO Auto-generated method stub
actionMode = null;//菜单销毁时置空
}
//表示我们要从xml文件中加载菜单
@Override
public boolean onCreateActionMode(ActionMode arg0, Menu menu) {
// TODO Auto-generated method stub
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.contentmenu, menu);//加载xml布局menu
return true;
}
//在这个函数里捕获用户的选项操作
@Override
public boolean onActionItemClicked(ActionMode arg0, MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.edit:
Toast.makeText(MyActionModeMenu.this, "点击了edit", Toast.LENGTH_SHORT).show();
break;
case R.id.save:
Toast.makeText(MyActionModeMenu.this, "点击了save", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
};
实现效果如下:
本来是这样:
长按ActionModel按钮:
五.popup menu。
点击按钮后会显示菜单选项。
给按钮设置点击事件,普通点击事件即可。
onMenuItemClick函数就是用户选择的项的处理事件。
popupmenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
PopupMenu popupMenu = new PopupMenu(MyActionModeMenu.this,v);
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
//在这里处理用户选择的项
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.edit:
Toast.makeText(MyActionModeMenu.this, "点击了edit", Toast.LENGTH_SHORT).show();
break;
case R.id.save:
Toast.makeText(MyActionModeMenu.this, "点击了save", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
});
然后显示菜单就可以了
MenuInflater menuInflater = popupMenu.getMenuInflater();
menuInflater.inflate(R.menu.contentmenu, popupMenu.getMenu());
popupMenu.show();//显示菜单
效果如下:
这里有几篇链接讲解的非常清楚:
Android菜单详解(一)——理解android中的Menu
Android菜单详解(三)——SubMenu和IconMenu
Android菜单详解(四)——使用上下文菜单ContextMenu