Android第五讲--Menu
Android系统里面有3种类型的菜单:options menu,context menu,sub menu。 options menu和context menu是并列关系,他们下面可以有子菜单sub menu,但sub menu下不能再有子菜单,所以Android最多只能有两级菜单。
options menu按Menu键就会显示,用于当前的Activity。
它包括两种菜单项:
因为options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menu,icon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件,所以不能设置checkable选项。
而多于6的菜单项会以“more” icon menu来调出,称为expanded menu。它不支持icon,其他的特性都和icon menu一样。
在Activity里面,一般通过以下函数来使用options menu:
Activity::onCreateOptionsMenu (Menu menu) 创建options menu,这个函数只会在menu第一次显示时调用。
Activity::onPrepareOptionsMenu (Menu menu) 更新改变options menu的内容,这个函数会在menu每次显示时调用。
Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。
Java代码:
public class MainActivity extends Activity { private EditText et; static final private int MI1 = Menu.FIRST; static final private int MI2 = Menu.FIRST + 1; static final private int MI3 = Menu.FIRST + 2; static final private int MI4 = Menu.FIRST + 3; static final private int MI5 = Menu.FIRST + 4; static final private int MI6 = Menu.FIRST + 5; static final private int MI7 = Menu.FIRST + 6; static final private int MI8 = Menu.FIRST + 7; static final private int MI9 = Menu.FIRST + 8; static final private int MI10 = Menu.FIRST + 9; static final private int MI11 = Menu.FIRST + 10; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et = (EditText) findViewById(R.id.tvSubMenu); registerForContextMenu(et); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem item2 = menu.add(0, MI2, Menu.NONE, R.string.item2); // 第一个参数是组ID,第三个参数是菜单项的顺序位置 MenuItem item3 = menu.add(0, MI3, Menu.NONE, R.string.item3); MenuItem item4 = menu.add(0, MI4, Menu.NONE, R.string.item4); MenuItem item5 = menu.add(0, MI5, Menu.NONE, R.string.item5); MenuItem item6 = menu.add(0, MI6, Menu.NONE, R.string.item6); MenuItem item7 = menu.add(0, MI7, Menu.NONE, R.string.item7); //设置简称 item4.setTitleCondensed("Short Title"); // 分配图标 item3.setIcon(R.drawable.add_new_item); // 分配快捷方式 item3.setShortcut('0', 'a'); // 如果使用数字键盘就是0,如果使用全键盘就是a //菜单单项单击监听器,但是不鼓励这样做,菜单项应被onOptionsItemSelected处理 item5.setOnMenuItemClickListener(new OnMenuItemClickListener(){ public boolean onMenuItemClick(MenuItem arg0) { // TODO Auto-generated method stub et.setText("Orisun"); return false; } }); //当单击一个事件菜单后,该事件既没有被MenuItemClickListener处理,也没有被OptionsItemSelected处理,就会触发分配给这个菜单项的Intent. item6.setIntent(new Intent(this,SecActivity.class)); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch (item.getItemId()) { case MI3: Toast.makeText(getApplicationContext(), "You choose Menu Item 3", Toast.LENGTH_SHORT).show(); default:break; } return false; } //每次显示菜单的时候会调用onPrepareOptionsMenu,根据程序的运行状态,可以对菜单进行动态的更改,可以动态地启用/禁用每一个菜单项 @Override public boolean onPrepareOptionsMenu(Menu menu){ super.onPrepareOptionsMenu(menu); if(et.getText().toString()!=""){ MenuItem menuItem=menu.findItem(MI3); menuItem.setIcon(R.drawable.remove_item); } return true; } }
sub menu
不支持icon
Java代码:
//在options menu里面增加一个子菜单
//在options menu里面增加一个子菜单 public boolean onCreateOptionsMenu(Menu menu) { SubMenu subMenu = menu.addSubMenu(0,0,Menu.NONE,"SubMenu"); subMenu.setHeaderIcon(R.drawable.icon); subMenu.setIcon(R.drawable.icon); //为子菜单添加一个菜单项 MenuItem summenuItem=subMenu.add(0,0,Menu.NONE,”Submenu Item”); //....... }
context menu 要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起。
这类型的菜单不支持icon和快捷键!
在Activity里面,一般通过以下函数来使用context menu:
Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。
Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context meun每次显示时都会调用这个函数。
Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。
Java代码:
public void onCreate(Bundle savedInstanceState) { //...... //为一个View注册一个上下文菜单 registerForContextMenu(et); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add(1, MI8, Menu.NONE, "item 1").setCheckable(true) .setChecked(false); menu.add(1, MI11, Menu.NONE, "item 3").setCheckable(true) .setChecked(true); //注意MI8,MI11和MI9,MI10的groupID不一样了 int groupId = 0; int menuItemOrder = Menu.NONE; menu.add(groupId, MI9, menuItemOrder, "Item 1 in group"); menu.add(groupId, MI10, menuItemOrder, "Item 2 in group").setChecked( true); //函数原型setGroupCheckable(int group, boolean checkable,boolean exclusive) menu.setGroupCheckable(groupId, true, true);// 这句话要写在groupitem的最后。 //为context menu添加子菜单 SubMenu subMenu2 = menu.addSubMenu("Sub Menu 1"); subMenu2.add("Sub Menu Item").setOnMenuItemClickListener( new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { Toast.makeText(getApplicationContext(), "Sub Menu Item Selected", Toast.LENGTH_SHORT) .show(); return false; } }); } @Override public boolean onContextItemSelected(MenuItem item) { super.onContextItemSelected(item); switch (item.getItemId()) { case MI9: Toast.makeText(getApplicationContext(), "You choose Item 1 in group", Toast.LENGTH_SHORT).show(); default:break; } return false; }
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item1"
android:title="item1"
android:icon="@drawable/icon"
android:checkable="true"
android:checked="false"/>
<group android:id="@+id/group1"
android:checkableBehavior="single">
<item android:id="@+id/group_item1"
android:title="Item 1 in group"/>
<item android:id="@+id/group_item2"
android:title="Item 2 in group"
android:checked="true"/>
</group>
<item android:id="@+id/submenu"
android:title="Sub Menu">
<menu>
<item android:id="@+id/submenuitem"
android:title="Sub Menu Item"/>
</menu>
</item>
<item android:id="@+id/item3"
android:title="item3"
android:checkable="true"
android:checked="true"/>
</menu>
public class SecActivity extends Activity{
private EditText et;
@Override
public void onCreate(Bundle context){
super.onCreate(context);
setContentView(R.layout.sec);
et=(EditText)findViewById(R.id.tvSubMenu);
registerForContextMenu(et);
}
@Override
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.contextmenu, menu);
}
}
长按EditText就会出现ContextMenu,点击Sub Menu就会出现右边这个图片。
本文来自博客园,作者:高性能golang,转载请注明原文链接:https://www.cnblogs.com/zhangchaoyang/articles/1958902.html