关闭

android 基础 之 菜单 MENU

标签: android菜单
151人阅读 评论(0) 收藏 举报

1.Android中,菜单被分为三种:

选项菜单 OptionsMenu,上下文菜单 ContextMenu,弹出式菜单 PopupMenu

 

Android应用中的菜单默认是隐藏的,只有用户点击手机上的Menu键才会显示菜单,这种菜单即为 选项菜单,又称系统菜单。

android 3.0之后,不再要求手机设备上必须提供MENU键。Android推荐使用ActionBar来代替Menu

Android系统会自动检测手机设备是否存在物理菜单键,如果没有,显示…(overflow)按钮。


2.Android提供两种创建菜单的方式:

1>在java代码中创建菜单

2>使用xml资源文件创建菜单(res/menu目录下)。优先使用此方法


1>使用Java代码方式创建菜单

     创建android项目后,eclipse会在src/包名 / MainActivity.java文件中 自动创建 onCreateOptionsMenu方法

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);//默认把菜单文件填充到menu
	return true;  // true 表示启动选项菜单
}
我们要做的就是:自定义添加菜单项

MenuItemmenu = menu.add(groupId,itemId,order,title);

//groupId分组 : Menu.NONE 不分组

//ItemId 菜单的标识常量  0x111

//order

//title 菜单标题

//创建选项菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {//menu 选项菜单
    	//1 添加菜单项
    	menu.add(Menu.NONE, 0x111, Menu.NONE, "菜单1");// groupId 分组   itemId 菜单标识常量   title菜单标题
    	menu.add(Menu.NONE, 0x112, Menu.NONE, "菜单2");// groupId 分组   itemId 菜单标识常量   title菜单标题
    	menu.add(Menu.NONE, 0x113, Menu.NONE, "菜单3");// groupId 分组   itemId 菜单标识常量   title菜单标题
        return true; //表示启动选项菜单 true 
    }

运行后单击菜单键就可以看到三个我们自己定义的菜单选项:“菜单1”,“菜单2”,“菜单3”;
但是我们的目的是:实现和我们用的手机菜单 相近的功能,步骤:
1.设定每个菜单项的常量(便于后面监听我们使用switch);
2.初始化文本输入框;
3.设置菜单选项;
4.添加事件监听switch;

在Activity中添加监听,onOptionsItemSelected(MenuItem item);
item即选择的菜单项,根据item.getItemId()判断选择的具体菜单项
public class MainActivity extends Activity {
	//首先自定义菜单项常量
	private final int FONT_10 = 0x110;
	private final int FONT_12 = 0x112;
	private final int FONT_14 = 0x114;
	private final int FONT_16 = 0x116;
	private final int FONT_18 = 0x118;

	private final int PLAIN_ITEM = 0x125;

	private final int COLOR_RED = 0x222;
	private final int COLOR_GREEN = 0x223;
	private final int COLOR_BLUE = 0x224;

	private EditText et_name;//文本输入框

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		et_name = (EditText) findViewById(R.id.et_name);
	}

	@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);
		// 1添加一个子菜单
		SubMenu fontmMenu = menu.addSubMenu("字体大小");
		// 1.1设置图标
		fontmMenu.setIcon(R.drawable.ic_launcher);
		// 1.2设置子菜单头标题
		fontmMenu.setHeaderTitle("请选择字体");
		// 1.3设置子菜单的头图标
		fontmMenu.setHeaderIcon(R.drawable.game100);
		// 1.4给子菜单添加菜单项
		fontmMenu.add(0, FONT_10, 0, "10号字体");
		fontmMenu.add(0, FONT_12, 0, "12号字体");
		fontmMenu.add(0, FONT_14, 0, "14号字体");
		fontmMenu.add(0, FONT_16, 0, "16号字体");
		fontmMenu.add(0, FONT_18, 0, "18号字体");
		// 2添加一个普通的菜单项
		MenuItem menuitem = menu.add(0, PLAIN_ITEM, 0, "普通菜单");
		// 2.1设置菜单项的图标
		menuitem.setIcon(R.drawable.game005);

		// 3 添加一个颜色子菜单
		SubMenu colorMenu = menu.addSubMenu("颜色");
		// 3.1设置图标
		colorMenu.setIcon(R.drawable.ic_launcher);
		// 3.2设置头标题
		colorMenu.setHeaderTitle("请选择颜色");
		// 3.3设置头图标
		colorMenu.setHeaderIcon(R.drawable.game006);
		// 3.4添加菜单
		colorMenu.add(0, COLOR_RED, 0, "红色");
		colorMenu.add(0, COLOR_GREEN, 0, "绿色");
		colorMenu.add(0, COLOR_BLUE, 0, "蓝色");
		return true;
	}

	// 添加选项菜单监听
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {// item 你选中的菜单项
		// TODO Auto-generated method stub

		switch (item.getItemId()) {// 获取菜单项的id
		case FONT_10:
			et_name.setTextSize(10);
			break;
		case FONT_12:
			et_name.setTextSize(12);
			break;
		case FONT_14:
			et_name.setTextSize(14);
			break;
		case FONT_16:
			et_name.setTextSize(16);
			break;

		case FONT_18:
			et_name.setTextSize(18);
			break;
		case PLAIN_ITEM:
			Toast.makeText(this, "你点击了普通菜单", 0).show();
			break;

		case COLOR_RED:
			et_name.setTextColor(Color.RED);
			break;

		case COLOR_GREEN:
			et_name.setTextColor(Color.GREEN);
			break;

		case COLOR_BLUE:
			et_name.setTextColor(Color.BLUE);
			break;
		default:
			break;
		}

		return super.onOptionsItemSelected(item);
	}

}
注意:

【1】2.3.3模拟器上设置菜单项的setIcon() setTitleCondensed()有作用

3.0以上由于使用ActionBar,菜单键也可有可无,只有设置显示在ActionBar中才能看到

//menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS|MenuItem.SHOW_AS_ACTION_WITH_TEXT);

//menuItem.setIcon(R.drawable.ic_launcher);

//menuItem.setTitleCondensed("普通");

【2】只有手机有菜单键,才能查看到子菜单的头标题和头图标


而如果要显示overflow按钮:
//显示overflow按钮
 private void getOverflowMenu() {
      try {
          ViewConfiguration config = ViewConfiguration.get(this);
          Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
          if(menuKeyField != null) {
               menuKeyField.setAccessible(true);
               menuKeyField.setBoolean(config, false);
          }
     } catch (Exception e) {
          e.printStackTrace();
     }
}


功能虽然实现了,但是是不是觉得很麻烦,为了实现一个小小的菜单,我们要写辣莫多代码,那么让我们来看看如何使用xml资源文件创建菜单(res/menu目录下)。

2>使用xml资源文件创建菜单(res/menu目录下的main.xml):
菜单资源文件必须使用<menu>标签作为根节点,使用<item>、<group>标签设置菜单项和分组;
<menu>标签没有任何属性,可以嵌套在<item>标签中表示子菜单的形式,但是<item>标签中不能再嵌入<item>标签。

<item>标签的属性及含义:

id

表示菜单项资源id

menuCategory

菜单项的种类,该属性可取4个值:containersystemsecondaryalternative。通过menuCategroy属性可以控制菜单项的位置

orderInCategory

同种类菜单的排列顺序。该属性需要设置一个整数值,数字大的在后面

title

菜单项标题

icon

菜单项图标资源ID,无效果

checkable

菜单项是否在带复选框

checked

如果菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为truefalse

visible

菜单项默认状态是否可视

enable

菜单项默认状态是否被激活


<group>标签属性和含义:

属性

含义

id

表示菜单项资源id

menuCategory

同菜单项

orderInCategory

同菜单项

checkableBehavior

设置该组所有菜单项上显示的选择组件(CheckBoxRadio Button)。如果将该属性值设为all,显示CheckBox组件;如果设为single,显示Radio Button组件;如果设为none,显示正常的菜单项(不显示任何选择组件)

icon

菜单项图标资源ID,不一定有效果

visible

示当前组中所有菜单项是否显示

enable

表示当前组中所有菜单项是否被激活


<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:icon="@drawable/ic_launcher"
        android:title="字体大小">
        <menu>
            <group android:checkableBehavior="single"
                 >
                <item
                    android:id="@+id/font_10"
                 	android:checked="true"
                    android:title="10号字体"/>
                <item
                    android:id="@+id/font_12"
                    	android:checked="true"
                    android:title="12号字体"/>
                <item
                    android:id="@+id/font_14"
                    android:title="14号字体"/>
            </group>
        </menu>
    </item>
    <item
        android:id="@+id/plain_item"
        android:title="普通菜单"/>
    <item
        android:icon="@drawable/ic_launcher"
        android:title="颜色">
        <menu>
            <item
                android:id="@+id/color_red"
                android:checkable="true"
                android:checked="true"
                android:menuCategory="system"
                android:title="红色"/>
            <item
                android:id="@+id/color_green"
                android:menuCategory="container"
                android:title="绿色"/>
            <item
                android:id="@+id/color_blue"
                android:menuCategory="secondary"
                android:title="蓝色"/>
            <item
                android:id="@+id/color_black"
                android:enabled="false"
                android:menuCategory="alternative"
                android:title="黑色"/>
        </menu>
    </item>

</menu>

当然我们还是要在MainActivity.java文件中添加事件监听
public boolean onOptionsItemSelected(MenuItem item) {
	// TODO Auto-generated method stub
	switch (item.getItemId()) {
	case R.id.font_10:
		et_name.setTextSize(10);
		break;
	case R.id.font_12:
		et_name.setTextSize(12);
		break;
	case R.id.font_14:
		et_name.setTextSize(14);
		break;

	case R.id.color_red:
		et_name.setTextColor(Color.RED);
		break;
	case R.id.color_green:
		et_name.setTextColor(Color.GREEN);
		break;
	case R.id.color_blue:
		et_name.setTextColor(Color.BLUE);
		break;
	default:
		break;
	}
	return super.onOptionsItemSelected(item);
}


二.上下文菜单ContextMenu:

继承自 android.view.Menu;


上下文菜单ContextMenu和选项菜单OptionsMenu的区别:

       OptionsMenu的拥有者是Activity,而ContextMenu的拥有者是Activity中的view;

       每个Activity中有且只有一个OptionsMenu,它为整个activity服务 。而activity往往有多个View,每当View需要ContextMenu时,可以通过registerForContextMenu(View view)注册。


ContextMenu使用步骤:

1.调用Activity的registerForContextMenu(View view)方法为view组件注册ContextMenu(注册ContextMenu后,用户长按该控件后显示上下文菜单);

2.重写onCreateContextMenu(ContextMenu menu,View view,ContextMenuInfo menuInfo)方法

3.为菜单项提供响应,重写onContextItemSelected(MenuItem item);


ContextMenuInfo有什么作用呢?

ContextMenuInfo携带了注册ContextMenu控件的的一些额外信息,一般在AdapterView(如:Spinner,ListView或GridView)上,可以在ContextMenuInfo中获取到适配器View中的position的信息。

AdapterContextMenuInfo acmi = (AdapterContextMenuInfo)menuInfo;

int pos = acmi. position;  //在AdapterView中,该条目的位置下标信息(从0开始)。

    final int MENU1=0x111;
    final int MENU2=0x112;
    final int MENU3=0x113;
    TextView txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt=(TextView) findViewById(R.id.txt);
        registerForContextMenu(txt);
    }

    @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);
        return true;
    }
	
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {
         // TODO Auto-generated method stub
         if(v!=null){
              Toast.makeText(this, v.getClass().getName(), Toast.LENGTH_SHORT).show();
         }
         menu.add(0,MENU1,0,"红色");
         menu.add(0,MENU2,0,"绿色");
         menu.add(0,MENU3,0,"蓝色");
         //将三个菜单项设置为单项菜单项
         menu.setGroupCheckable(0, true, true);
         //设置上下文菜单的标题、图标
         menu.setHeaderIcon(R.drawable.ic_launcher);
         menu.setHeaderTitle("选择背景色");
    
         super.onCreateContextMenu(menu, v, menuInfo);
    }
    @Override
    public boolean onContextItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
         switch (item.getItemId()) {
         case MENU1:
              item.setChecked(true);
              txt.setBackgroundColor(Color.RED);
              break;
         case MENU2:
	      item.setChecked(true);
	      txt.setBackgroundColor(Color.GREEN);
	      break;
	 case MENU3:
	      item.setChecked(true);
              txt.setBackgroundColor(Color.BLUE);
              break;
         default:
              break;
         }
         return super.onContextItemSelected(item);
   }

三.弹出式菜单  PopupMenu:

弹出式菜单 PopupMenu会在指定组件上弹出,默认情况下,PopupMenu会显示在该组件的下方或者上方。PopupMenu可增加多个菜单项,并可为菜单项增加子菜单。


使用PopupMenu 步骤:
1.调用new PopupMenu(Context context,View anchar)创建下拉菜单,anchar代表要激发该弹出菜单的组件;
2.调用MenuInflater的inflater()方法将菜单填充到PopupMenu;
3.调用PopupMenu的show()方法显示弹出式菜单。
4.调用setOnMenuItemClickListener()设置菜单项点击监听;
 public void click1(View view){
    //创建popupmenu对象
    popup=new PopupMenu(this, view);
    //将R.menu.popupmenu添加到弹出菜单
    getMenuInflater().inflate(R.menu.popupmenu, popup.getMenu());
    //为popupmenu的菜单项添加监听
    popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {

	@Override
	public boolean onMenuItemClick(MenuItem item) {
	      // TODO Auto-generated method stub
	      switch (item.getItemId()) {
	      case R.id.exit:
	           popup.dismiss();
	           break;

              default:
		   String s="你单击了【"+item.getTitle()+"】菜单项";
		   Toast.makeText(MainActivity.this, s,Toast.LENGTH_SHORT).show();
		   break;
	      }
	      return false;
	}
    });
    //显示弹出式菜单
    popup.show();
    
 }





1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:254次
    • 积分:23
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档