在博客standupTimer项目中选项菜单的应用中粗略的介绍了standupTimer项目的选项菜单,也就是把standupTimer项目中选项菜单相关的源码贴出来,并没有做任何的延伸。Android的菜单主要包括选项菜单(OptionsMenu),内容菜单(ContextMenu)和子菜单(SubMenu)三种菜单,这篇博客算是standupTimer项目中选项菜单的应用的延伸,主要总结下内容菜单和子菜单。
内容菜单(ContextMenu)又称为上下文菜单或者长按菜单,当用户长按住一个注册了上下文菜单的控件时,会弹出一个上下文菜单,它是一个流式的列表,供用户选择某项;内容菜单扩展自Menu,提供了修改上下文菜单头(header)的功能,上下文菜单不支持菜单项的快捷方式和图标,但是可以为上下文菜单设置图标。
其实掌握了内容菜单的编程套路,内容菜单容器来也是蛮简单的,至少最基本的用法很容易就能掌握,下面把内容菜单的基本使用代码贴下来,代码包括两部分,一部分是为TextView控件增加内容菜单,另外一部分是为ListView控件增加内容菜单。
下面是为TextView控件增加内容菜单的代码:
首先要在布局的xml文件中增加一个TextView控件并实现实例化,还要为TextView控件注册上下文菜单:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView) this.findViewById(R.id.lv);
this.registerForContextMenu(lv);
}
然后实现函数onCreateContextMenu()创建上下文菜单,当长按TextView控件的时候,onCreateContextMenu()函数会被调用,函数中把定义好的xml文件直接填充进来,onCreateContextMenu()函数和xml文件如下:
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
}
以上是静态方式实现上下文菜单,还可以在onCreateContextMenu()函数中动态的实现上下文菜单,一个简单的实现代码如下:
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Title");
menu.setHeaderIcon(R.drawable.team);
menu.add(0, 0, 0, "复制");
menu.add(0, 1, 0, "剪贴");
menu.add(0, 2, 0, "重命名");
}
最后添加菜单选择监听事件,也就是覆盖函数onContextItemSelected(),当上下文菜单被选择的时候,该函数会被调用:public boolean onContextItemSelected (MenuItem item) {
switch (item.getItemId()) {
case R.id.about:
Logger.d("Displaying the about box");
displayAboutBox();
return true;
case R.id.help:
Logger.d("Displaying the help dialog");
displayHelpDialog();
return true;
case R.id.settings:
Logger.d("Displaying the settings");
displaySettings();
return true;
case R.id.teams:
Logger.d("Displaying the team configuration");
displayTeamConfiguration();
return true;
default:
Logger.e("Unknown menu item selected");
return false;
}
}
下面是为ListView控件实现上下文菜单代码:protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView) this.findViewById(R.id.lv);
this.registerForContextMenu(lv);
initListView();//对ListView进行初始化,也就是设置适配器adapter;
private void initListView() {
menuStrs = new String[] { "TEST1", "TEST2", "TEST3", "TEST4" };
adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1, menuStrs);
lv.setAdapter(adapter);
}
然后实现函数onCreateContextMenu()创建上下文菜单,当长按ListView控件中的一个选项的时候,onCreateContextMenu()函数会被调用,函数中把定义好的xml文件直接填充进来,xml文件同在上面定义的,onCreateContextMenu()函数和如下:
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
}
最后添加菜单选择监听事件,也就是覆盖函数onContextItemSelected (),当上下文菜单被选择的时候,该函数会被调用:
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.about:
menuStrs[menuInfo.position] += "about";
displayAboutBox();
return true;
case R.id.help:
menuStrs[menuInfo.position] += "help";
displayHelpDialog();
return true;
case R.id.settings:
menuStrs[menuInfo.position] += "settings";
displaySettings();
return true;
case R.id.teams:
menuStrs[menuInfo.position] += "teams";
displayTeamConfiguration();
return true;
default:
menuStrs[menuInfo.position] += "Unknown menu item selected";
return false;
}
adapter.notifyDataSetChanged();
return true;
}
从上面可以看出实现为控件增加上下文菜单。总的来说也主要分为三部:
第一步:覆盖onCreateContextMenu()方法,或者静态或者动态的创建上下文菜单;
第二部:覆盖onOptionsItemSelected()方法,为上下文菜单实现监听函数;
第三部:为控件注册上下文菜单,这里的注册函数registerForContextMenu()是将控件和上下文菜单联系起来的桥梁;
子菜单和选项菜单比较类似,它的特点是可以将菜单进行分组,更方面用户进行选择和操作,其实无论是选项菜单,子菜单还是上下文菜单,创建方式都有两种,一种是使用xml文件静态创建,另外一种是使用动态方式创建,子菜单的示例使用静态方式进行创建,动态创建需要的时候再自己搜索下就OK了。
子菜单的应用和选项菜单的应用基本上是相同的,就静态创建菜单方式而言,子菜单和选项菜单xml是不同的,所要覆盖的函数完全相同。
使用子菜单的示例代码如下:
首先创建xml文件,供onCreateOptionsMenu()调用的时候加载,xml文件定义如下:
加载函数为:
public boolean onCreateOptionsMenu(Menumenu) {
getMenuInflater().inflate(R.menu.menu,menu);
return true;
}
菜单选择事件监听函数为:public boolean onOptionsItemSelected(MenuItem item) {//菜单选择事件监听
switch (item.getItemId()){
case R.id.new_file:
Toast.makeText(this,"您选择了新建按钮",Toast.LENGTH_SHORT).show();
break;
case R.id.open_file:
Toast.makeText(this,"您选择了打开按钮",Toast.LENGTH_SHORT).show();
break;
case R.id.edit_file:
Toast.makeText(this,"您选择了编辑按钮",Toast.LENGTH_SHORT).show();
break;
case R.id.delete_set:
Toast.makeText(this,"您选择了删除按钮",Toast.LENGTH_SHORT).show();
break;
case R.id.exit_set:
Toast.makeText(this,"您选择了退出按钮",Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
另外,除了以上两个函数外,菜单中比较常用的另外两个函数为:参考网址:
http://blog.csdn.net/u012702547/article/details/49448031
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/android-sub-menu.html