android学习笔记(41)android选项菜单和子菜单(SubMenu )

文章标签: android,android-menu
2015-1-10 19:55:16     人阅读    

为了让读者感受Android应用中菜单的外观和功能,先简单看一下Android系统自带的 选项菜单,按如下两步进行。
           单击模拟器右边的_按键(返回桌面),系统返回桌面。
          单击模拟器右边的“MENU”按键,将可以在手机屏幕下方看到系统默认的选项菜单
      Android的选项菜单默认是看不见的,当用户按下“MENU”键时 程序菜单将会出现在屏幕下方。Android系统默认最多只有6个菜单位,如果超过6个菜单, 系统将会在第6个菜单位显示“更多”。

 Android菜单支持的4个接口。
Menu接口只是一个父接U,该接口下有两个子接口。
 SubMenu:它代表一个普通菜单。它可以包含1〜yv个Menultem (形成菜单项)。
ContextMenu:它代表一个子菜单。它可以包含1〜at个Menultem (形成菜单项)。 Menu接口定义了如下方法来添加菜单或菜单项。
Menultem add(int titleRes):添加一个新的菜单项。
Menultem add(int groupld, int itemld, int order, CharSequence title)••添加一个新 的处于groupld组的菜单项。
Menultem add(int groupld, int itemld, int order, int titleRes):添加一个新的处于 groupld组的菜单项。
Menultem add(CharSequence title):添加一个新的菜单项。
SubMenu addSubMenu(int titleRes):添加一个新的子菜单。
SubMenu addSubMenu(int groupld, int itemld, int order, int titleRes):添加一个新 的处于groupld组的子菜单。
SubMenu addSubMenu(CharSequence title):添加一个新的子菜单。
SubMenu addSubMenu(int groupld, int itemld, int order, CharSequence title):添 加一个新的处于groupld组的子菜单。


上面的方法归纳起来就是两个:add()方法用于添加菜单项;addSubMenuO用于添加子菜 单。这些重载方法的区别只是:是否将子菜单、菜单项添加到指定菜单中,是否使用资源文 件中的字符串资源来设置标题。
SubMenu继承了 Memi,它就代表了一个子菜单,额外提供了如下常用方法。

SubMenu setHeaderlcon(Drawable icon):设置菜单头的图标。
SubMenu setHeaderlcon(int iconRes}:设置菜单头的图标。
SubMenu setHeaderTitle(inttitleRes):设置菜单头的标题。
SubMenu setHeaderTitle(CharSequence title):设置菜单头的标题。
SubMenu setHeaderView(View view):使用 View 来设置菜单头。


掌握了上面Menu、SubMenu、Menultem的用法之后,接下来就可通过它们来为Android 应用添加菜单或子菜单了。添加菜单或子菜单的步骤如下。
G 重写 Activity 的 onCreateOptionsMenu(Menu menu)的方法,在该方法里调用 Menu 对 象的方法来添加菜单项或子菜单。
G如果希望应用程序能响应菜单项的单击事件,重写Activity的on0PtionshemSelected (Menultem mi)方法即可。
下面的程序示范了如何为Android应用添加菜单和子菜单。该程序的界面布局很简单, 故不给出界面布局的文件。该程序的Java代码如下。
程序清单:codes\02\2.7\MenuTest\src\org\crazyit\menu\MenuTest.java

package org.crazyit.menu;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.MenuItem.OnMenuItemClickListener;
import android.widget.EditText;
import android.widget.Toast;

public class MenuTest extends Activity
{
 // 定义字体大小菜单项的标识
 final int FONT_10 = 0x111;
 final int FONT_12 = 0x112;
 final int FONT_14 = 0x113;
 final int FONT_16 = 0x114;
 final int FONT_18 = 0x115;
 // 定义普通菜单项的标识
 final int PLAIN_ITEM = 0x11b;
 // 定义字体颜色菜单项的标识
 final int FONT_RED = 0x116;
 final int FONT_BLUE = 0x117;
 final int FONT_GREEN = 0x118;
 
 private EditText edit;

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  edit = (EditText) findViewById(R.id.txt);
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu)
 {
  // -------------向menu中添加字体大小的子菜单-------------
  SubMenu fontMenu = menu.addSubMenu("字体大小");
  // 设置菜单的图标
  fontMenu.setIcon(R.drawable.font);
  // 设置菜单头的图标
  fontMenu.setHeaderIcon(R.drawable.font);
  // 设置菜单头的标题
  fontMenu.setHeaderTitle("选择字体大小");  
  fontMenu.add(0, FONT_10, 0, "10号字体");
  fontMenu.add(0, FONT_12, 0, "12号字体");
  fontMenu.add(0, FONT_14, 0, "14号字体");
  fontMenu.add(0, FONT_16, 0, "16号字体");
  fontMenu.add(0, FONT_18, 0, "18号字体");
  // -------------向menu中添加普通菜单项-------------
  menu.add(0, PLAIN_ITEM, 0, "普通菜单项");
  // -------------向menu中添加文字颜色的子菜单-------------
  SubMenu colorMenu = menu.addSubMenu("字体颜色");
  colorMenu.setIcon(R.drawable.color);
  // 设置菜单头的图标
  colorMenu.setHeaderIcon(R.drawable.color);
  // 设置菜单头的标题
  colorMenu.setHeaderTitle("选择文字颜色"); 
  colorMenu.add(0, FONT_RED, 0, "红色");
  colorMenu.add(0, FONT_GREEN, 0, "绿色");
  colorMenu.add(0, FONT_BLUE, 0, "蓝色");
  return super.onCreateOptionsMenu(menu);
 }

 @Override
 // 菜单项被单击后的回调方法
 public boolean onOptionsItemSelected(MenuItem mi)
 {
  //判断单击的是哪个菜单项,并针对性的作出响应。
  switch (mi.getItemId())
  {
   case FONT_10:
    edit.setTextSize(10 * 2);
    break;
   case FONT_12:
    edit.setTextSize(12 * 2);
    break;
   case FONT_14:
    edit.setTextSize(14 * 2);
    break;
   case FONT_16:
    edit.setTextSize(16 * 2);
    break;
   case FONT_18:
    edit.setTextSize(18 * 2);
    break;
   case FONT_RED:
    edit.setTextColor(Color.RED);
    break;
   case FONT_GREEN:
    edit.setTextColor(Color.GREEN);
    break;
   case FONT_BLUE:
    edit.setTextColor(Color.BLUE);
    break;
   case PLAIN_ITEM:
    Toast toast = Toast.makeText(MenuTest.this
     , "您单击了普通菜单项" , Toast.LENGTH_SHORT);
    toast.show();
    break;
  }
  return true;
 }
}


上面的程序中粗体字代码就是添加三个菜单的代码,三个菜单中有两个是子菜单,而且程序还为子菜单设置了图标、标题等。运行上面的程序

前面已经介绍过,如果程序要监听菜单项的单击事件,可以通过重写onOptionsItemSelected (Menultem item)方法来实现 每当用户单击任意菜单时,该方法都会被触发。如果开发者需要针对不同菜单提供响应,就需要在onOptionsItemSelected(MenuItem item)方法中进行判断了,如上程序使用switch语句进行了判断。由于程序需要在 onOptionsItemSelected(MenuItem item)方法中准确判断到底是哪个菜单项被单击了,因此添加 菜单项时通常应为每个菜单项指定ID。


原文地址:http://www.itmmd.com/201501/469.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

android学习笔记(42)android使用监听器来监听菜单事件   上一篇
下一篇  android JSON - no value for x
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!