安卓控件之菜单
- OptionsMenu(选项菜单/系统菜单),创建方式:
- 1) 通过res\menu下的XML文件配置,并在Activity的onCreateOptionsMenu()方法中加载,配置时,应该至少配置id、orderInCategory、title属性
- 2) 在Activity的onCrateOptionsMenu()方法中,通过参数Menu的add()方法添加
响应方法: - 1) 明确每个菜单项的id
- 2) 重写Activity的onOptionsItemSelected()方法,对参数MenuItem进行判断后进行响应
- SubMenu(子菜单),创建方式:
- 1) 在res\menu下的XML文件中,为一级菜单的节点添加子级
- 2) 在Activity的onCreateOptionsMenu()方法中,使用addSubMenu()添加出可以存在子级菜单的一级菜单,并获取调用该方法时的返回值,返回值类型为SubMenu,然后通过该返回值继续调用若干次add()方法,以创建若干个子级菜单
- Ps:菜单项的响应不区分菜单项的级别,所以,子菜单的响应与普通菜单的完全相同
- ContextMenu(上下文菜单)
- 特点:上下文菜单是通过长按某个控件后弹出的菜单;上下文菜单必须通过registerForContextMenu()方法注册到控件之上,对应的控件才会有上下文菜单
- 创建方法:通过重写Activity的onCreateContextMenu()方法可以创建上下文菜单,具体创建过程与创建OptionsMenu相同,可以为多个控件都注册上下文菜单,当创建时,则根据onCreateContextMenu()的第2个参数View判断是由长按了哪个控件导致需要上下文菜单,从而决定创建出不同的菜单项
- 响应方法:通过重写Activity的OnContextItemSelected()方法可以响应上下文菜单的选择
使用程序创建OptionsMenu和SubMenu:
package cn.myapp.menu;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private static final int MENU_NEW_ID = 100;
private static final int MENU_OPEN_ID = 200;
private static final int MENU_SAVE_ID = 300;
private static final int MENU_CLOSE_ID = 400;
private static final int MENU_NEW_JAVA_ID = 1001;
private static final int MENU_NEW_WORD_ID = 1002;
private static final int MENU_NEW_TEXT_ID = 1003;
@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);
SubMenu subMenu = menu.addSubMenu(Menu.NONE, MENU_NEW_ID, 1, "新建");
subMenu.add(Menu.NONE, MENU_NEW_JAVA_ID, 2, "Java文件");
subMenu.add(Menu.NONE, MENU_NEW_WORD_ID, 2, "Word文档");
subMenu.add(Menu.NONE, MENU_NEW_TEXT_ID, 2, "Text文件");
menu.add(Menu.NONE, MENU_OPEN_ID, 2, "打开");
menu.add(Menu.NONE, MENU_SAVE_ID, 3, "保存");
menu.add(Menu.NONE, MENU_CLOSE_ID, 4, "关闭");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// switch (item.getItemId()) {
// case MENU_NEW_ID:
// Toast.makeText(this, "New", Toast.LENGTH_LONG).show();
// break;
//
// case MENU_OPEN_ID:
// Toast.makeText(this, "Open File", Toast.LENGTH_LONG).show();
// break;
//
// case MENU_SAVE_ID:
// Toast.makeText(this, "Save", Toast.LENGTH_LONG).show();
// break;
//
// case MENU_CLOSE_ID:
// Toast.makeText(this, "Close", Toast.LENGTH_LONG).show();
// break;
// }
return super.onOptionsItemSelected(item);
}
}
—- ——
使用ContextMenu
package cn.myapp.menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class ContextMenuSampleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_context_menu_sample);
registerForContextMenu(findViewById(R.id.imageView1));
}
private static final int MENU_SHARE_ID = 10;
private static final int MENU_SAVE_ID = 20;
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(Menu.NONE, MENU_SAVE_ID, 1, "保存");
menu.add(Menu.NONE, MENU_SHARE_ID, 1, "共享");
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_SAVE_ID:
Toast.makeText(this, "即将保存图片", Toast.LENGTH_LONG).show();
break;
case MENU_SHARE_ID:
Toast.makeText(this, "将图片分享给他人", Toast.LENGTH_LONG).show();
break;
}
return super.onContextItemSelected(item);
}
}
为多个View注册ContextMenu
package cn.myapp.menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class ContextMenuSampleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_context_menu_sample);
registerForContextMenu(findViewById(R.id.imageView1));
registerForContextMenu(findViewById(R.id.tv_hello_world));
}
private static final int MENU_SHARE_ID = 10;
private static final int MENU_SAVE_ID = 20;
private static final int MENU_OPEN_URL_ID = 30;
private static final int MENU_DISPLAY_INFO_ID = 40;
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
switch (v.getId()) {
case R.id.imageView1:
// 图片的上下文菜单
menu.add(Menu.NONE, MENU_SAVE_ID, 1, "保存");
menu.add(Menu.NONE, MENU_SHARE_ID, 2, "共享");
break;
case R.id.tv_hello_world:
// 文字的上下文菜单
menu.add(Menu.NONE, MENU_OPEN_URL_ID, 1, "打开图片网址");
menu.add(Menu.NONE, MENU_DISPLAY_INFO_ID, 2, "查看图片详情");
break;
}
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_SAVE_ID:
Toast.makeText(this, "即将保存图片", Toast.LENGTH_LONG).show();
break;
case MENU_SHARE_ID:
Toast.makeText(this, "将图片分享给他人", Toast.LENGTH_LONG).show();
break;
}
return super.onContextItemSelected(item);
}
}
为AdapterView应用ContextMenu,这部分代码很多,请上我的github下载。