Menu的基本使用方法

Anndroid中的菜单分为以下几类:
1 、选项菜单:常用的菜单,英文叫Options menu,平时通过用菜单键唤出的就是此菜单
2、上下文菜单:通过长按特定的控件唤出的菜单,类似windows中的右键菜单
3、子菜单:android中通过点击子菜单的父级菜单唤出子菜单,同时子菜单的弹出方式是悬浮窗。子菜单不支持嵌套,即子菜单本身不能再添加子菜单。

下面先介绍代码的方式添加菜单。
首先是选项菜单。
要创建选项菜单,我们可以复写Activity的onCreateOptionsMenu方法,具体的代码例子如下:
   
   
package com.egotrip.wcc.ui;
 
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
 
import com.egotrip.wcc.R;
 
public class MenuReviewActivity extends AppCompatActivity {
 
private Toolbar tb_menu_review;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
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
public boolean onCreateOptionsMenu(Menu menu) {
 
menu.add("MenuItem1");
 
menu.add(R.string.MenuItem2);
 
menu.add(1, Menu.FIRST, Menu.FIRST, "MenuItem3");
 
return true;
}
}
这里说一下三种添加OptionsMenu的方式:
1、直接添加一个title即可
2、用资源文件里的strings.xml中的string添加title
3、这种比较复杂,add的四个参数的含义分别是,小组ID,条目ID,序号,title。下面解释一下这几个参数的作用:小组ID是为了方便对一个小组中所有的菜单项进行管理;条目ID是这个菜单项的唯一标识,当有菜单项被点击后,通过此ID来判断是哪个菜单项被点击了,从而进行对应的相应;序号是菜单项显示顺序的编号,序号越小,越在前;title就是菜单的文本。

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

因为我用的是真机调试,而且菜单键的功能被改了,所以我加了一个Toolbar来测试菜单效果,下面是布局文件的代码:
   
   
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns: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
public boolean onCreateOptionsMenu(Menu menu) {
 
int base = 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);
 
 
return true;
}
效果图:

解释一下几个方法的含义:
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
public boolean onOptionsItemSelected(MenuItem item) {
 
switch (item.getItemId())// 此处的itemId就是上面的add方法中的第二个参数
{
case 1:
case 2:
case 3:
case 4:
ToastUtils.showToast(item.getTitle()+"", this);
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
效果图:


第二种方式就是定义一个类实现OnMenuItemClickListener,然后在需要响应的菜单项上面设置监听器:
   
   
package com.egotrip.wcc.ui;
 
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
 
import com.egotrip.wcc.R;
import com.egotrip.wcc.utils.ToastUtils;
 
public class MenuReviewActivity extends AppCompatActivity {
 
private Toolbar tb_menu_review;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
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
public boolean onCreateOptionsMenu(Menu menu) {
 
int base = Menu.FIRST;
menu.add(1, 1, 1, "menuItem1").setOnMenuItemClickListener(new MyOnMenuItemClickListener());
menu.add(1, 2, 2, "menuItem2").setOnMenuItemClickListener(new MyOnMenuItemClickListener());
menu.add(2, 3, 3, "menuItem3").setOnMenuItemClickListener(new MyOnMenuItemClickListener());
menu.add(2, 4, 4, "menuItem4").setOnMenuItemClickListener(new MyOnMenuItemClickListener());
menu.add(3, 5, 5, "menuItem5").setOnMenuItemClickListener(new MyOnMenuItemClickListener());
menu.add(3, 6, 6, "menuItem6").setOnMenuItemClickListener(new MyOnMenuItemClickListener());
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);
 
 
return true;
}
 
public class MyOnMenuItemClickListener implements MenuItem.OnMenuItemClickListener{
 
@Override
public boolean onMenuItemClick(MenuItem item) {
 
ToastUtils.showToast(item.getItemId()+"", MenuReviewActivity.this);
return true;
}
}
 
@Override
public boolean onOptionsItemSelected(MenuItem item) {
 
switch (item.getItemId())// 此处的itemId就是上面的add方法中的第二个参数
{
case 1:
case 2:
case 3:
case 4:
ToastUtils.showToast(item.getTitle()+"", this);
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
}
效果图:

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

第三种方式是直接使用MenuItem类的setIntent方法实现页面的跳转。如下:
   
   
menu.add(1, 1, 1, "menuItem1").setIntent(new Intent(this, MenuActivity.class));
效果图:

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

下面来说说子菜单。先看一个例子:
   
   
@Override
public boolean onCreateOptionsMenu(Menu menu) {
 
int base = Menu.FIRST;
 
menu.add("选项菜单").setIcon(R.drawable.forward);
SubMenu subMenu = 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;
 
SubMenu subMenu2 = 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");
 
return true;
}
上面的代码演示了给OptionsMenu添加子菜单的方式。另外,我还分别调用了OptionsMenu的MenuItem、SubMenu以及SubMenu的MenuItem的setIcon方法,为它们图标。下面是效果图:

我们先说setIcon方法的效果。我们从图中可以看到,我为OptionsMenu的MenuItem以及SubMenu设置的Icon都没奏效,只有我为SubMenu的MenuItem设置的Icon奏效了。
现在来说说怎么添加子菜单。其实代码中已经写的很清楚了,我们先为OptionsMenu添加一个SubMenu,然后给这个SubMenu添加MenuItem就行了,剩下的内容,诸如设置小组,设置响应都和上面的OptionsMenu一样,所以这里就不说了。


接下来看ContextMenu,也就是上下文菜单。上面也说过了,上下文菜单,就是长按Activity中的View而出现的菜单。先来看一个例子吧:
首先修改布局文件,在其中添加一个TextView,我接下来要在它上面添加上下文菜单:
   
   
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns: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中的代码:
   
   
package com.egotrip.wcc.ui;
 
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
 
import com.egotrip.wcc.R;
import com.egotrip.wcc.utils.ToastUtils;
 
public class MenuReviewActivity extends AppCompatActivity {
 
private Toolbar tb_menu_review;
private TextView tv_menu_review;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
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
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
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
public boolean onContextItemSelected(MenuItem item) {
 
if(item.getItemId() == 3)
ToastUtils.showToast(item.getTitle()+"", this);
 
return true;
}
}
效果图:

如上图,长按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
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
 
menu.setHeaderIcon(R.drawable.back);
menu.setHeaderTitle("上下文菜单");
SubMenu subMenu = 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,就是我新创建的。下面是它的具体内容:
   
   
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 
<group android: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>
<group android: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
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
 
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_review, menu);
}
效果图:

代码都很简单,没什么好说的。除了这样使用xml,我们也可以在xml中给菜单添加子菜单,就像下面这样:
   
   
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 
<group android: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>
其他都不用变,我们来看效果图:


其他的,我们还可以给菜单项添加图标,设置其可不可见,可不可用,是否添加复选框以及是否选中等,例子:
    
    
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 
<group android: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。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值