Android基础之Menu控件

本文详细介绍了 Android 应用中的菜单系统,包括 OptionMenu 和 ContextMenu 的创建与使用方法。通过 XML 定义菜单结构,并展示了如何通过代码实现菜单的动态更新及响应菜单项的点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Menu分为OptionMenu(点击MENU键时出现的菜单) ContextMenu(长点击一个菜单项时出现的菜单)

可以在XML文件中定义MENU,在res文件夹下建立menu目录,在下面定义菜单xml文件

<menu>必须是根目录,

其中每一个<item>是一个菜单项,也可以是一个<menu>来创建子菜单

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/file"
     android:title="@string/file" >
    <!-- "file" submenu -->
    <menu>
      <item android:id="@+id/create_new"
         android:title="@string/create_new" />
      <item android:id="@+id/open"
         android:title="@string/open" />
    </menu>
  </item>
</menu>

<item>有诸多属性如

android:id 当用户点击这个事件的时候可以识别这个item

android:icon item的图标

android:title item的标题


OptionMenu的使用

创建一个OptionMenu可以重写onCreateMenuItem()方法,在其中进行add(),
也可以根据XML文件来生成
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.game_menu, menu);
  return true;
}

重写onOptionsItemSelected()方法来指定点击item后的操作
@Override
public boolean onOptionsItemSelected(MenuItem item) {
  // Handle item selection
  switch (item.getItemId()) {
    case R.id.new_game:
      newGame();
      return true;
    case R.id.help:
      showHelp();
      return true;
    default:
      return super.onOptionsItemSelected(item);
  }
}
如果要在activity的生命周期内动态更改OptionMenu,使用OnPrepareOptionsMenu(),而onCreateOptionsMenu()中add等操作之后,在activity整个生命周期中最好不变

ContextMenu的使用

通过调用registForContextMenu,把View传递进去进行注册,如果整个ListView或者GridView每一个item都需要一样的context menu,那就吧整个ListView,GridView传递给registerForContextMenu();
当一个item被长点击时,系统会调用onCreateContextMenu()
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.context_menu, menu);
}
如果你的每一个item要调用不同的contextView可以在这里,利用参数View v,ContextMenuInfo menuInfo来进行生成不同的contextMenu

onContextItemSelected(MenuItem item)
@Override
public boolean onContextItemSelected(MenuItem item) {
  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
  switch (item.getItemId()) {
    case R.id.edit:
      editNote(info.id);
      return true;
    case R.id.delete:
      deleteNote(info.id);
      return true;
    default:
      return super.onContextItemSelected(item);
  }
}


可以创建一个MenuGroup
<group android:id="@+id/group_delete">
    <item android:id="@+id/menu_archive"
       android:title="@string/menu_archive" />
    <item android:id="@+id/menu_delete"
       android:title="@string/menu_delete" />
  </group>
这样可以对成组的多个item进行setGroupVisible() setGroupEnable() setGroupCheckable()

可以创建一个ContextMenu,每一项item都是可选中的
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <group android:checkableBehavior="single">   <!--single单个选中RadioButton   all多个选中CheckBox     none --!>
    <item android:id="@+id/red"
       android:title="@string/red" />
    <item android:id="@+id/blue"
       android:title="@string/blue" />
  </group>
</menu>
当一项被选中的时候,调用onOptionItemSelected()方法,但是必须要手动设定其Checked状态
@Override
public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
    case R.id.vibrate:
    case R.id.dont_vibrate:
      if (item.isChecked()) item.setChecked(false);
      else item.setChecked(true);
      return true;
    default:
      return super.onOptionsItemSelected(item);
  }
}
如果不进行设定,用户选定的时候是不会变的...

当需要点击某个menuItem启动某个是自己应用的或者不是自己应用的Activity的时候,可以在回调方法中startActivity,
但如果不能确定是否有合适的activity或者有几个的时候,可以在onCreateOptionsMenu(Menu menu)中使用menu.addIntentOptions()方法
添加intent的category为 Intent.CATEGORY_ALTERNATIVE
@Override
public boolean onCreateOptionsMenu(Menu menu){
  super.onCreateOptionsMenu(menu);

  // Create an Intent that describes the requirements to fulfill, to be included
  // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
  Intent intent = new Intent(null, dataUri);
  intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

  // Search and populate the menu with acceptable offering applications.
  menu.addIntentOptions(
    R.id.intent_group, // Menu group to which new items will be added
    0,   // Unique item ID (none)
    0,   // Order for the items (none)
    this.getComponentName(),  // The current activity name
    null,  // Specific items to place first (none)
    intent, // Intent created above that describes our requirements
    0,   // Additional flags to control items (none)
    null); // Array of MenuItems that correlate to specific items (none)

  return true;
}
当然,如果想让自己的Activity在menu中进行引用
<intent-filter label="@string/resize_image">
  ...
  <category android:name="android.intent.category.ALTERNATIVE" />
  <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
  ...
</intent-filter>


ActionBar contextual action mode fragement popupMenu等3.0之后才有的概念暂且不提

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值