这里讲两种菜单,OptionsMenu选项菜单和ContextMenu上下文菜单。
什么是optionsMenu菜单呢?
右上角点击会有菜单出现,这个就是选项菜单。
那ContextMenu又长什么样呢?
通过长按某个item会出现这个,当然,这个是自定义的,这种几Ius上下文菜单。
先来说选项菜单OptionsMenu。
有两个方法:onCreateOptionsMenu和onOptionsItemSelected。
第一个方法是创建菜单及子菜单。
第二个方法是设置菜单的点击效果。
默认创建项目会有这两个方法,OncreateOptionsMenu方法中有个
getMenuInflater().inflate(R.menu.main, menu);是用来获得menu的xml文件传送到
menu空间当中。还可以用add自己添加菜单及子菜单选项。
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
menu.add(1, 1, 1, "菜单1");
menu.add(1, 2, 2, "菜单2");
SubMenu submenu = menu.addSubMenu(2, 3, 3, "子菜单");
submenu.add(2, 4, 4, "子菜单1");
submenu.add(2, 5, 5, "子菜单2");
submenu.add(2, 6, 6, "子菜单3");
submenu.add(2, 7, 7, "子菜单4");
return true;
}
返回类型是boolean类型,true为显示OptionsMenu菜单,false不显示菜单。
还有就是它的点击事件:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
Toast.makeText(getApplicationContext(), "settting", 0).show();
break;
case 2:
Toast.makeText(getApplicationContext(), "copy", 0).show();
break;
case 3:
Toast.makeText(getApplicationContext(), "子菜单", 0).show();
break;
case 4:
Toast.makeText(getApplicationContext(), "子菜单1", 0).show();
break;
default:
break;
}
return true;
}
之前默认的是if语句,个人感觉switch语句要比那个更简单点,同样也是boolean类型,
true的话消耗该事件。
接下来说contextmenu上下文菜单,其实和上面的选项菜单大同小异。
同样两个方法:onCreateContextMenu和onContextItemSelected。
这里通过ListView来展示上下文通过点击item来实现删除对应的item。
里面大家会看到这两个方法。
mainactivity:
package com.example.menutest;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView lv;
private ArrayAdapter<String> adapter;
private List<String> datas;
private int position;
private String str[]={"item1","item2","item3","item4","item5","item6","item7","item8"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) findViewById(R.id.main_lv);
registerForContextMenu(lv);
initDatas();
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);
lv.setAdapter(adapter);
}
private void initDatas() {
// TODO Auto-generated method stub
datas=new ArrayList<String>();
for (String string : str) {
datas.add(string);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
menu.add(1, 1, 1, "菜单1");
menu.add(1, 2, 2, "菜单2");
SubMenu submenu = menu.addSubMenu(2, 3, 3, "子菜单");
submenu.add(2, 4, 4, "子菜单1");
submenu.add(2, 5, 5, "子菜单2");
submenu.add(2, 6, 6, "子菜单3");
submenu.add(2, 7, 7, "子菜单4");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case 1:
Toast.makeText(getApplicationContext(), "settting", 0).show();
break;
case 2:
Toast.makeText(getApplicationContext(), "copy", 0).show();
break;
case 3:
Toast.makeText(getApplicationContext(), "子菜单", 0).show();
break;
case 4:
Toast.makeText(getApplicationContext(), "子菜单1", 0).show();
break;
default:
break;
}
return true;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
AdapterContextMenuInfo info=(AdapterContextMenuInfo) menuInfo;
position=info.position;//因为哪个item点击产生的contextmenu
menu.setHeaderIcon(android.R.drawable.ic_media_ff);
menu.setHeaderTitle("请选择:");
menu.add(1, 1, 1, "删除");
menu.add(1, 2, 2, "关注");
menu.add(1, 3, 3, "卸载");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case 1:
datas.remove(position);
adapter.notifyDataSetChanged();
toast("删除了");
break;
case 2:
toast("关注了");
break;
case 3:
toast("卸载了");
break;
default:
break;
}
return true;
}
public void toast(String text)
{
Toast.makeText(getApplicationContext(), text, 0).show();
}
}
ContextMenuInfo接口里面有AdapterContextMenuInfo可以获取对应点击item的下
标。
这里强调一点:
在使用contextmenu菜单时需要注册registerForContextMenu(View);
只有这控件初始化以后注册菜单,才可以使用此菜单。