Android控件之Menu

Android中的Menu(菜单)控件有三种类型:

    1. 选项菜单 (Options menu)

    2. 上下文菜单 (Context menu)

    3. 弹出菜单 (Popup menu)

 

使用XML文件来定义菜单布局,菜单xml文件要建在/res/menu目录中,跟创建Menu有关的xml标签有:

    <menu>: 用来定义一个菜单,必须是菜单xml文件的根标签。

    <item>: 用来定义菜单中的选项。内部也可以包含另一个<menu>标签来创建子菜单。

    <group>:  用来将一组<item>整合并分类。

 

示例:  文件名为 my_menu.xml

<?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>
 
    <item android:id="@+id/new_game"
         android:icon="@drawable/ic_new_game"
         android:title="@string/new_game"
         android:showAsAction="ifRoom|withText"/>  <!-- showAsAction可以让该选项显示在ActionBar上而不是...中,如果既有icon又有title,那么默认显示icon,如何想要显示title就应该加上withText -->
    <item android:id="@+id/help"
         android:icon="@drawable/ic_help"
         android:title="@string/help" />
</menu>




. Options Menu

options menu的显示与Android版本有关.

Android 2.3.X (API Level <= 10) :

        

        多余6个的item会在more中被集成

 

Android 3.0 (API Level > 10):

        

        如果<item>中设置了android:showAsAction="ifRoom"就会像 2号选项 那么显示

 

要想把刚才的my_menu.xml加入到程序中,只需要在源码文件中的 onCraeteOptionsMenu(Menu menu) 中加入如下代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu, menu); //在这里通过填充器把菜单的xml的文件传入第一个参数
    return true;
}

 如果想要在用户选择了某个选项时执行某些功能,可以在相应的Activity文件中加入如下代码:

@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);
    }
}

如果要给菜单动态添加选项可以使用 onPrepareOptionsMenu()方法,onPrepareOptionsMenu() 会在用户每次点击菜单时都会执行一次,而onCreateOptionsMenu()只在程序开始时执行一次(Android 2.3.X或以下的版本是在用户第一次点击点菜的时候执行)。动态添加选项的代码如下:

public boolean onPrepareOptionsMenu(Menu menu) {
	menu.add("item name");
	return true;
}



. Context Menu

Context menu类似于我们做长按操作时弹出的那种菜单,如图:


想要制作这种context menu需要三个步骤:

(1) 首先要注册context menu,通过 registerForContextMenu(View v)来注册,参数是要弹出context menu的View控件,比如现在我们的layout xml文件中定义了一个id为 a_view 的控件,我们希望长按 a_view 的时候弹出我们将要定义的菜单,那么可以这么写代码:

registerForContextMenu((View) findViewById(R.id.a_view));


(2) 类似于onCreateOptionsMenu(),如果要创建context menu需要使用 onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info) 函数来创建,实例如下:

@Override
public void onCreateContextMenu(ContextMenu menu, View view, /*参数View就是关联此菜单的控件,也就是你长按这个view就会弹出该菜单*/
                                ContextMenuInfo menuInfo) {
    <span style="white-space:pre">	</span>super.onCreateContextMenu(menu, view, menuInfo);
    <span style="white-space:pre">	</span>menu.add("item1");
<span style="white-space:pre">	</span>menu.add("item2");
}

(3) 如果想要在用户点击选项的时候执行某些功能,可以添加如下代码(类似于Options menu的处理方式,函数名字不同罢了):

@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);
    }
}



. Popup Menu(API Level >= 11 才可以)

看了context menu的图片后可能一听"popup"就觉得两种菜单是不是相似的,其实 Popup Menu 的显示是有区别的,popup menu的显示方式类似与我们平时单击鼠标右键弹出的那种菜单,就是你点在哪里,就从哪里蹦出菜单,而不是像context menu 那样菜单都在屏幕中间弹出。

样式类似于下图:


(点击了箭头后弹出了下面的菜单)


如果要制作一个Popup Menu,可以按如下步骤:

(1)首先需要有一个控件来作为弹出pop menu的源,那我们就以一个<TextView>来写实例吧,先在layout xml文件中定义如下代码:

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="pop"
        android:onClick="showPop" />  <!-- 没错,就跟定义普通的onClick事件一样 -->

(2)然后只需在 showPop() 函数中实现Popup Menu 的生成和弹出即可:

public void showPop(View view) {
	PopupMenu pop = new PopupMenu(this, view);
	pop.getMenuInflater().inflate(R.menu.mymenu, pop.getMenu());
	pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { //可以这样处理用户点击事件

		@Override
		public boolean onMenuItemClick(MenuItem item) {
			// TODO Auto-generated method stub
			switch (item.getItemId()) {
			case R.id.*:
				break;
			default:
				return false;
			}
		}
	});

	pop.show();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值