您的位置:首页 > 其它

Menu的基本使用方法

2015-12-08 16:39 197 查看
Anndroid中的菜单分为以下几类:

1、选项菜单:常用的菜单,英文叫Optionsmenu,平时通过用菜单键唤出的就是此菜单

2、上下文菜单:通过长按特定的控件唤出的菜单,类似windows中的右键菜单

3、子菜单:android中通过点击子菜单的父级菜单唤出子菜单,同时子菜单的弹出方式是悬浮窗。子菜单不支持嵌套,即子菜单本身不能再添加子菜单。

下面先介绍代码的方式添加菜单。

首先是选项菜单。

要创建选项菜单,我们可以复写Activity的onCreateOptionsMenu方法,具体的代码例子如下:

packagecom.egotrip.wcc.ui;
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.support.v7.widget.Toolbar;
importandroid.view.Menu;
importcom.egotrip.wcc.R;
publicclassMenuReviewActivityextendsAppCompatActivity{
privateToolbartb_menu_review;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_review);
tb_menu_review=(Toolbar)findViewById(R.id.tb_menu_review);
setSupportActionBar(tb_menu_review);
tb_menu_review.setTitleTextColor(Color.WHITE);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
menu.add("MenuItem1");
menu.add(R.string.MenuItem2);
menu.add(1,Menu.FIRST,Menu.FIRST,"MenuItem3");
returntrue;
}
}


这里说一下三种添加OptionsMenu的方式:
1、直接添加一个title即可
2、用资源文件里的strings.xml中的string添加title
3、这种比较复杂,add的四个参数的含义分别是,小组ID,条目ID,序号,title。下面解释一下这几个参数的作用:小组ID是为了方便对一个小组中所有的菜单项进行管理;条目ID是这个菜单项的唯一标识,当有菜单项被点击后,通过此ID来判断是哪个菜单项被点击了,从而进行对应的相应;序号是菜单项显示顺序的编号,序号越小,越在前;title就是菜单的文本。

有一个要注意的地方:如果想要让菜单显示的话,返回值得是true。

因为我用的是真机调试,而且菜单键的功能被改了,所以我加了一个Toolbar来测试菜单效果,下面是布局文件的代码:

<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.egotrip.wcc.ui.MenuReviewActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/tb_menu_review"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
/>
</RelativeLayout>


效果图如下:



下面来演示一下通过小组ID对同一组的菜单项进行同意操作:

修改Activity中的onCreateOptionsMenu方法:

@Override
publicbooleanonCreateOptionsMenu(Menumenu){
intbase=Menu.FIRST;
menu.add(1,1,1,"menuItem1");
menu.add(1,2,2,"menuItem2");
menu.add(2,3,3,"menuItem3");
menu.add(2,4,4,"menuItem4");
menu.add(3,5,5,"menuItem5");
menu.add(3,6,6,"menuItem6");
menu.add(4,7,7,"menuItem7");
menu.add(4,8,8,"menuItem8");
menu.setGroupVisible(1,true);
menu.setGroupCheckable(2,true,true);
menu.setGroupEnabled(3,false);
menu.setGroupVisible(4,false);
returntrue;
}


效果图:



解释一下几个方法的含义:

1、Menu.setGroupVisible(int,boolean):设置小组是否显示,第一个参数是小组ID,至于boolean值,true代表显示,false代表不显示,默认是显示的,也就是true

2、Menu.setGroupCheckable(int,boolean,boolean):是否给小组中的菜单项添加复选框,第一个参数是小组ID,第二个参数,true代表设置,false代表不设置,第三个参数设置复选框的形状,true代表方形,false代表圆形

3、Menu.setGroupEnabled(int,boolean):设置小组中的菜单项是否可用,第一个参数是小组ID,至于boolean值,true代表可用,false代表不可用,默认是可用的,也就是true

下面看看OptionsMenu的响应方式:这里介绍三种方式

第一种方式就是复写Activity的onOptionsItemSelected方法,在其中进行响应操作,就像下面这样:

@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId())//此处的itemId就是上面的add方法中的第二个参数
{
case1:
case2:
case3:
case4:
ToastUtils.showToast(item.getTitle()+"",this);
break;
default:
returnsuper.onOptionsItemSelected(item);
}
returntrue;
}


效果图:



第二种方式就是定义一个类实现OnMenuItemClickListener,然后在需要响应的菜单项上面设置监听器:

packagecom.egotrip.wcc.ui;
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.support.v7.widget.Toolbar;
importandroid.view.Menu;
importandroid.view.MenuItem;
importcom.egotrip.wcc.R;
importcom.egotrip.wcc.utils.ToastUtils;
publicclassMenuReviewActivityextendsAppCompatActivity{
privateToolbartb_menu_review;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_review);
tb_menu_review=(Toolbar)findViewById(R.id.tb_menu_review);
setSupportActionBar(tb_menu_review);
tb_menu_review.setTitleTextColor(Color.WHITE);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
intbase=Menu.FIRST;
menu.add(1,1,1,"menuItem1").setOnMenuItemClickListener(newMyOnMenuItemClickListener());
menu.add(1,2,2,"menuItem2").setOnMenuItemClickListener(newMyOnMenuItemClickListener());
menu.add(2,3,3,"menuItem3").setOnMenuItemClickListener(newMyOnMenuItemClickListener());
menu.add(2,4,4,"menuItem4").setOnMenuItemClickListener(newMyOnMenuItemClickListener());
menu.add(3,5,5,"menuItem5").setOnMenuItemClickListener(newMyOnMenuItemClickListener());
menu.add(3,6,6,"menuItem6").setOnMenuItemClickListener(newMyOnMenuItemClickListener());
menu.add(4,7,7,"menuItem7");
menu.add(4,8,8,"menuItem8");
menu.setGroupVisible(1,true);
menu.setGroupCheckable(2,true,true);
menu.setGroupEnabled(3,false);
menu.setGroupVisible(4,false);
returntrue;
}
publicclassMyOnMenuItemClickListenerimplementsMenuItem.OnMenuItemClickListener{
@Override
publicbooleanonMenuItemClick(MenuItemitem){
ToastUtils.showToast(item.getItemId()+"",MenuReviewActivity.this);
returntrue;
}
}
@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId())//此处的itemId就是上面的add方法中的第二个参数
{
case1:
case2:
case3:
case4:
ToastUtils.showToast(item.getTitle()+"",this);
break;
default:
returnsuper.onOptionsItemSelected(item);
}
returntrue;
}
}


效果图:



如上图所示,我在代码中用两种方式设置了菜单的响应,当两种方式都存在时,优先采用设置监听器的方式响应菜单点击事件。

第三种方式是直接使用MenuItem类的setIntent方法实现页面的跳转。如下:

menu.add(1,1,1,"menuItem1").setIntent(newIntent(this,MenuActivity.class));


效果图:



在此说明,当三种方式共存时,优先采用第二种,其次采用第一种,最后采用第三种。此处说的采用是系统默认采用的意思。

下面来说说子菜单。先看一个例子:

@Override
publicbooleanonCreateOptionsMenu(Menumenu){
intbase=Menu.FIRST;
menu.add("选项菜单").setIcon(R.drawable.forward);
SubMenusubMenu=menu.addSubMenu("子菜单1");
subMenu.setIcon(R.drawable.save);
subMenu.add(base,base,base,"submenuItem1").setIcon(R.drawable.back);
subMenu.add(base,base+1,base+1,"submenuItem2");
subMenu.add(base,base+2,base+2,"submenuItem3");
subMenu.add(base,base+3,base+3,"submenuItem4");
base+=4;
SubMenusubMenu2=menu.addSubMenu("子菜单2");
subMenu2.add(base,base,base,"submenuItem1");
subMenu2.add(base,base+1,base+1,"submenuItem2");
subMenu2.add(base,base+2,base+2,"submenuItem3");
subMenu2.add(base,base+3,base+3,"submenuItem4");
returntrue;
}


上面的代码演示了给OptionsMenu添加子菜单的方式。另外,我还分别调用了OptionsMenu的MenuItem、SubMenu以及SubMenu的MenuItem的setIcon方法,为它们图标。下面是效果图:



我们先说setIcon方法的效果。我们从图中可以看到,我为OptionsMenu的MenuItem以及SubMenu设置的Icon都没奏效,只有我为SubMenu的MenuItem设置的Icon奏效了。

现在来说说怎么添加子菜单。其实代码中已经写的很清楚了,我们先为OptionsMenu添加一个SubMenu,然后给这个SubMenu添加MenuItem就行了,剩下的内容,诸如设置小组,设置响应都和上面的OptionsMenu一样,所以这里就不说了。

接下来看ContextMenu,也就是上下文菜单。上面也说过了,上下文菜单,就是长按Activity中的View而出现的菜单。先来看一个例子吧:

首先修改布局文件,在其中添加一个TextView,我接下来要在它上面添加上下文菜单:

<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.egotrip.wcc.ui.MenuReviewActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/tb_menu_review"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"/>
<TextView
android:id="@+id/tv_menu_review"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#66ff0000"
android:text="ContextMenuDemo"
android:textColor="#000000"
android:textSize="32sp"/>
</RelativeLayout>


接下来在Activity中的代码:

packagecom.egotrip.wcc.ui;
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.support.v7.widget.Toolbar;
importandroid.view.ContextMenu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.widget.TextView;
importcom.egotrip.wcc.R;
importcom.egotrip.wcc.utils.ToastUtils;
publicclassMenuReviewActivityextendsAppCompatActivity{
privateToolbartb_menu_review;
privateTextViewtv_menu_review;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_review);
tb_menu_review=(Toolbar)findViewById(R.id.tb_menu_review);
setSupportActionBar(tb_menu_review);
tb_menu_review.setTitleTextColor(Color.WHITE);
tv_menu_review=(TextView)findViewById(R.id.tv_menu_review);
this.registerForContextMenu(tv_menu_review);
}
@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
menu.setHeaderIcon(R.drawable.back);
menu.setHeaderTitle("上下文菜单");
menu.add(1,1,1,"item1");
menu.add(1,2,2,"item2");
menu.add(1,3,3,"item3");
menu.add(1,4,4,"item4");
}
@Override
publicbooleanonContextItemSelected(MenuItemitem){
if(item.getItemId()==3)
ToastUtils.showToast(item.getTitle()+"",this);
returntrue;
}
}


效果图:



如上图,长按Textview以悬浮窗的形式弹出ContextMenu,然后点击Item3,显示Item3的title。在上面的代码中通过复写Activity的onCreateContextMenu方法,创建ContextMenu。不过,在此之前,必须现在onCreate方法中为TextView,也就是目标View注册ContextMenu,也就是通过下面这句代码实现的:

this.registerForContextMenu(tv_menu_review);


创建ContextMenu的其他操作和创建OptionsMenu的一样,这里就不细说了。

然而想要对应的菜单项被点击时,做出相应的响应,我们可以复写Activity的onContextItemSelected方法进行操作。具体的操作和onOptionsItemSelected一样,也不细说了。

哦,忘了说了,在上面的代码中,我还为ContextMenu添加了HeaderTitle和HeaderIcon,不过这都比较简单,看代码就明白怎么操作了,这里就提一句算了。

接下来看看给ContextMenu添加子菜单的实现吧:

@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
menu.setHeaderIcon(R.drawable.back);
menu.setHeaderTitle("上下文菜单");
SubMenusubMenu=menu.addSubMenu("SubMenu");
subMenu.add("subItem1");
subMenu.add("subItem2");
subMenu.add("subItem3");
subMenu.add("subItem4");
menu.add(1,1,1,"item1");
menu.add(1,2,2,"item2");
menu.add(1,3,3,"item3");
menu.add(1,4,4,"item4");
}


效果图:



给ContextMenu添加子菜单的操作和OptionsMenu一样。

最后来说一下用xml生成菜单。

想要用xml生成菜单,先得在res目录下新建一个menu目录,然后再在里面创建菜单的xml。下面我就来创建一个:



图中背景为灰色的xml,就是我新创建的。下面是它的具体内容:

<?xmlversion="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<groupandroid:id="@+id/group1">
<item
android:id="@+id/item1"
android:title="item1"/>
<item
android:id="@+id/item2"
android:title="item2"/>
<item
android:id="@+id/item3"
android:title="item3"/>
</group>
<groupandroid:id="@+id/group2">
<item
android:id="@+id/item4"
android:title="item4"/>
<item
android:id="@+id/item5"
android:title="item5"/>
<item
android:id="@+id/item6"
android:title="item6"/>
</group>
</menu>


在Activity中可以这样使用上面的xml文件:

@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
MenuInflaterinflater=getMenuInflater();
inflater.inflate(R.menu.menu_review,menu);
}


效果图:



代码都很简单,没什么好说的。除了这样使用xml,我们也可以在xml中给菜单添加子菜单,就像下面这样:

<?xmlversion="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<groupandroid:id="@+id/group1">
<item
android:id="@+id/item1"
android:title="item1">
<menu>
<item
android:id="@+id/submenu1"
android:title="submenuitem1"/>
<item
android:id="@+id/submenu2"
android:title="submenuitem2"/>
<item
android:id="@+id/submenu3"
android:title="submenuitem3"/>
<item
android:id="@+id/submenu4"
android:title="submenuitem4"/>
</menu>
</item>
<item
android:id="@+id/item2"
android:title="item2"/>
<item
android:id="@+id/item3"
android:title="item3"/>
</group>
</menu>


其他都不用变,我们来看效果图:



其他的,我们还可以给菜单项添加图标,设置其可不可见,可不可用,是否添加复选框以及是否选中等,例子:

<?xmlversion="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<groupandroid:id="@+id/group1"
android:checkableBehavior="all">
<item
android:id="@+id/item1"
android:title="item1"
android:checked="true">
<menu>
<item
android:id="@+id/submenu1"
android:title="submenuitem1"/>
<item
android:id="@+id/submenu2"
android:title="submenuitem2"/>
<item
android:id="@+id/submenu3"
android:title="submenuitem3"/>
<item
android:id="@+id/submenu4"
android:title="submenuitem4"/>
</menu>
</item>
<item
android:id="@+id/item2"
android:title="item2"
android:enabled="false"/>
<item
android:id="@+id/item3"
android:title="item3"
android:visible="false"/>
</group>
</menu>


效果图:



正如xml中我设置的那样:我给group1设置了android:checkableBehavior="all",实现了给所有的菜单项添加复选框;给item1设置了android:checked="true"的属性,实现了item1的默认选中;给item2设置了android:enabled="false",实现了item2的不可用;给item3设置了android:visible="false",实现了item3的不可见。

还忘了一个给菜单项设置图标的:

<item
android:id="@+id/item1"
android:title="item1"
android:icon="@drawable/forward"
android:checked="true">


不过我测试了,没效果,截图:



最后说一下,以上的通过xml方式实现菜单的添加的例子,用的都是ContextMenu,OptionsMenu与其类似。菜单的响应方式需要通过代码的方式实现,就是上面提到过的那三种。还有就是所有的Activity中的复写的方法,如果返回值是boolean的话,都要return
true。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: