android菜单详解

1.菜单的生成

对一个Android应用中的每一个屏幕,也就是说,对每一个Activity类,都会拥

有一个默认菜单。在Activity类中,定义了几个与菜单有关的方法,

供继承于Activity类的子类去重载,从而定制我们自己的菜单。这几个方法为:

public booleanonCreateOptionsMenu(android.view.Menu menu);

public booleanonPrepareOptionsMenu(android.view.Menu menu);

public booleanonOptionsItemSelected(android.view.MenuItem item);

为了生成我们自己的菜单,Android为我们提供了两个时机点。当在Activity类

实例启动时,我们可以通过重载onCreateOptionsMenu()来定制我们的菜单;

另外,也可以在菜单每次被调用时,对菜单中的项重新生成,通过重载onPrepareOptionsMenu

来实现。对于第二种方式,由于每次调用时都要重新生成,对于那些不经常变化的菜单,效率就会比较低

对一个菜单的定义步骤:

1、 创建一个包含文本视图的XML布局文件

2、 创建一个Activity类,其中包含在第一步中定义的布局

3、 设置菜单

4、 向菜单添加一些常规菜单项

5、 向菜单添加一些辅助菜单项

6、 响应菜单项

7、 修改AndroidManifest.xml文件。以显示应用程序正确的标题(一定要修改,这个很容易忘

Android的菜单分为三种类型:选项菜单(Option Menu)、上下文菜单(Context

Menu)、子菜单(Sub Menu)

一.选项菜单

当用户单击设备上的菜单按钮(Menu),触发事件弹出的菜单就是选项菜单。选

项菜单最多只有六个,超过六个第六个就会自动显示 更多 选项来展示显示。

创建方法:

XML文件

<?xml version="1.0"encoding="utf-8"?>

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

    <item android:id="@+id/newFile"

       android:icon="@drawable/ic_launcher"

       android:title="@string/newFile_title"

       />

    <item android:id="@+id/exit"

        android:icon="@drawable/ic_launcher"

        android:title="@string/exit_title"

       />

</menu>

1、覆盖Activity的onCreateOptionsMenu(Menu menu)方法,当我们第一次打

开菜单时调用。

public boolean onCreateOptionsMenu(Menu menu) {

//获取menu文件

    MenuInflater inflater = this.getMenuInflater();

//把获取的menu文件实例填充到menu对象中  

inflater.inflate(R.menu.options_menu, menu);

return true;

}(基本不可或缺的)

2、调用Menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的

setIcon()方法为菜单项设置图标。

        menu.add(1,SAVE, 1, "保存");

        menu.add(1, SAVE_AS, 2, "另存为");

       menu.add(1, DELETE, 3, "删除");

        menu.findItem(SAVE).setIcon(R.drawable.ic_launcher);

第一个参数表示给这个新增的菜单项分配一个分组号;

第二个参数表示给这个新增的菜单项分配一个唯一标识id;

第三个参数表示给这个新增的菜单项分配一个顺序

第四个参数为菜单项的标题。

我们可以通过调用Menu.setItemShown()或者Menu.setGroupShown()方法来显示或隐藏一些菜单项。

3、当菜单项(MenuItem)被选中时,覆盖Acitivy的onOptionsMenuSelected()

方法响应事件。

    public boolean onOptionsItemSelected(MenuItem item) {

       switch(item.getItemId()){

       case R.id.newFile:

           Toast.makeText(this, "newfile", Toast.LENGTH_SHORT).show();

           break;

       case R.id.exit:

           this.finish();

           break;

      

       case DELETE:

           menu.removeGroup(2);

           menu.removeItem(SAVE_AS);

           break;

       }

       return true;

    }

响应事件  点击exit会直接退出;


点击删除按钮直接把SAVE_AS删除   就是另存为

menu.removeItem(SAVE_AS);


二、上下文菜单

当用户长按Activity页面时,弹出的菜单我们称为上下文菜单。我们经常

在Windows中用鼠标右键单击弹出的菜单就是上下文菜单。

1、覆盖Activity的onCreateContextMenu()方法,调用Menu的add方法添加

菜单项MenuItem

    public void onCreateContextMenu(ContextMenu menu, View v,

           ContextMenuInfo menuInfo) {

       MenuInflater inflater = this.getMenuInflater();

       inflater.inflate(R.menu.sub_menu, menu);

       super.onCreateContextMenu(menu,v, menuInfo);

    }(跟上边相同 add添加也相同)

2、覆盖onContextItemSelected()方法,响应菜单单击事件

    public boolean onContextItemSelected(MenuItem item) {

       switch(item.getItemId()){

       case R.id.sub1:

           break;

       case R.id.sub2:

           break;

             

       }

       return super.onContextItemSelected(item);

    }

3、调用registerForContextMenu()方法,为视图注册上下文菜单

TextView tv=(TextView) this.findViewById(R.id.idd);

            this.registerForContextMenu(tv);(一定要注册)

弹出菜单也可以响应事件

按住所注册的TexrView几秒钟会出现


三、子菜单

   子菜单就是将相同功能的分组进行多级显示的一种菜单,比如,Windows

的“文件”菜单中就有“新建”,“打开”,“关闭”等子菜单。

创建子菜单的方法

1、覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()

方法添加子菜单项

子菜单可以通过XML定义

<item android:id="@+id/menuitem1"

     android:title="menuitem1"/>

<item android:id="@+id/menuitem2"

     android:title="menuitem2">

     <menu>

         <item

            android:id="@+id/sub1"

            android:title="sub1"

            ></item>

         <item

            android:id="@+id/sub2"

            android:title="sub2"

            ></item>

     </menu>

     </item>

 

也可以通过调用SubMenu的add(),添加子菜单项

    public boolean onCreateOptionsMenu(Menu menu) {

           MenuInflater inflater = this.getMenuInflater();

           inflater.inflate(R.menu.sub_menu, menu);

           SubMenu subMenu=menu.addSubMenu(1, SUBMENU, 1, "子菜单");

           subMenu.add(20, SUBITEM1, 1, "subitem1");

           subMenu.add(20, SUBITEM2, 2, "subitem2");

           subMenu.add(30, SUBITEM3, 3, "subitem3");

//         subMenu.setGroupCheckable(20, true, true);

//         subMenu.getItem(0).setCheckable(true);

           subMenu.getItem(0).setChecked(true);//选中这个 如果为false;则不选中

           subMenu.findItem(SUBITEM3).setCheckable(true);

           return true;

       }

2、覆盖onCreateItemSelected()方法,响应菜单单击事件

public boolean onOptionsItemSelected(MenuItem item) {

       switch(item.getItemId()){

       case R.id.menuitem1:

           Toast.makeText(this, "newfile", Toast.LENGTH_SHORT).show();

           break;

       case R.id.menuitem2:

           this.finish();

           break;

       case SUBITEM1:

           break;

       case SUBITEM2:

           this.finish();

           break;

       }

       return true;

    }


点击子菜单


menu.add的方法中的参数:

1.int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,

以便更好的以组的方式管理你的菜单按钮。可以用到的方法有:

removeGroup(id)

setGroupCheckable(id, checkable, exclusive)

setGroupEnabled(id,boolean enabled)

setGroupVisible(id,visible)

2.int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item

ID对应一个Menu中的选项。在后面使用菜单的时候,就是靠这个item ID来判

断,你选中的是哪个选项。

3、int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜

单的显示顺序就是按照add的顺序来显示。

4.String类型的title参数,表示选项中显示的文字。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值