Android笔记系列--Menu 菜单

系统菜单的基本实现

  • onCreateOptionsMenu():当用户按下设置键时,系统会调用这个方法,其中的Menu参数就是我们要显示的菜单;
  • onOptionsItemSelected():当用户选择一个菜单项时,系统会转到这个方法中进行处理。

创建菜单的两种方式

1)代码创建

添加菜单项

public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title)

参数:
- groupId:组ID
- itemId:菜单项ID,整个activity中,这个ID- 值必须是唯一的。
- order:是在一个菜单中的排序顺序,一个菜单的排序顺序会根据这个值,由小到大排列菜单项。

添加子菜单

SubMenu subMenu=menu.addSubMenu(groupId_2, 7, 7, “子菜单—SubMenu”);
subMenu.setIcon(R.drawable.ic_launcher);//给SubMenu设置Icon

菜单组操作
* setGroupVisible():将指定组的菜单设置为可见或不可见
* setGroupEnabled():将指定组的菜单设置为可用或不可用
* setGroupCheckable():将指定组的菜单设置为单选或多选

给菜单项添加一个Icon

MenuItem menuItem=menu.add(groupId_2, 6, 6, “2——去掉第一组的checkable”);
menuItem.setIcon(R.drawable.ic_launcher);

//给子菜单的菜单项添加Icon图标
MenuItem subItem=subMenu.add(groupId_3, 11, 3,”submenu_3”);
subItem.setIcon(R.drawable.ic_launcher);

public class MainActivity extends Activity { 

    private Menu mMenu; 
    private int groupId_1=1; 
    private int groupId_2=2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

        mMenu=menu; 

        //添加第一组菜单 
        menu.add(groupId_1, 1, 1, "1——将第二组按钮不可见"); 
        menu.add(groupId_1, 2, 2, "1——将第二组按钮可见"); 
        menu.add(groupId_1, 3, 3, "1——将第二组按钮不可用"); 
        menu.add(groupId_1, 4, 4, "1——将第二组按钮可用"); 

        //添加第二组菜单  
        menu.add(groupId_2, 5, 5, "2——将第一组变成checkable"); 

        //给一个菜单项添加Icon 
        MenuItem item=menu.add(groupId_2, 6, 6, "2——去掉第一组的checkable"); 
        item.setIcon(R.drawable.ic_launcher);

        //添加子菜单 
        SubMenu subMenu=menu.addSubMenu(groupId_2, 7, 7, "子菜单---SubMenu"); 
        subMenu.setIcon(R.drawable.ic_launcher);//给SubMenu设置Icon 

        //给SubMenu添加菜单项 
        subMenu.add(groupId_3, 9, 1,"submenu_1"); 
        subMenu.add(groupId_3, 8, 2,"submenu_2"); 

        //给子菜单的菜单项添加Icon图标 
        MenuItem subItem=subMenu.add(groupId_3, 11, 3,"submenu_3"); 
        subItem.setIcon(R.drawable.ic_launcher); 
        return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
        switch (item.getItemId()) { 
        case 1: 
            mMenu.setGroupVisible(groupId_2, false); 
            break; 
        case 2: 
            mMenu.setGroupVisible(groupId_2, true);      
            break; 
        case 3: 
            mMenu.setGroupEnabled(groupId_2, false); 
            break; 
        case 4: 
            mMenu.setGroupEnabled(groupId_2, true); 
            break; 
        case 5: 
            mMenu.setGroupCheckable(groupId_1, true, false); 
            //最下面有最后一个参数true和false的区别,简单来说,设为False,可多选,设为True,只能单选 
            break; 
        case 6: 
            mMenu.setGroupCheckable(groupId_1, false, false); 
            break; 

        default: 
            break; 
        } 
        return super.onOptionsItemSelected(item); 
    } 
} 

OnMenuItemClickListener() Item点击监听器

菜单项点击事件除了可以在onOptionsItemSelected()函数中进行拦截,还可以给MenuItem 使用setOnMenuItemClickListener()单独设置点击事件监听器。

注意:
1. 每一个监听函数仅针对一个item,所以如果使用自定义OnMenuItemClickListener监听函数,就要对每一个Item都要自定义一个,对于没有定义监听函数的MenuItem,消息仍会派发到onOptionsItemSelected()中进行处理;
2. 对于设定了监听函数的Item,系统会在自定义的OnMenuItemClickListener函数中进行处理,即便在onOptionsItemSelected()中也写了处理函数,但系统是不会再进入onOptionsItemSelected()中点击消息的;

menu.add(groupId_1, 1, 1, "menu1_1").setOnMenuItemClickListener(listener);

//自定义一个MenuItemClickListener监听函数
OnMenuItemClickListener listener =new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"listener response:" + item.getTitle(), Toast.LENGTH_SHORT).show();
return false;
}
};

2)XML创建

标签

<group>标签:
- id:组的Id值;
- heckableBehavior:用于指定菜单组内各项菜单项的选择行为,none(不可选)、all(多选 )、single(单选);
- menuCategory:用于对菜单分类,指定菜单的优先级,可选值为:container、system、secondary和alternative;
- enabled:用于指定该菜单组中的全部菜单项是否可用;
- visible:用于指定该菜单组中全部菜单项是否可见;

<item>标签:
- id:菜单项的ID;必须唯一
- title:用于为菜单项指定标题
- icon:用于为菜单项指定图标
- enabled:用于指定该菜单项是否可用
- checkable:用于指定该菜单项是否可选
- checked:用于指定该菜单项是否已选中
- visible:用于指定该菜单项是否可见
- alphabeticShortcut:用于为菜单项指定字符快捷皱键
- numericShortcut:用于为菜单项指定数字快捷皱键

xml布局
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.testmenu_xml.MainActivity" >
<group android:id="@+id/menuGroup_main">
<item android:id="@+id/menuItem_1"
android:icon="@drawable/ic_launcher"
android:title="menu_1"/>
<item android:id="@+id/menuItem_2"
android:icon="@drawable/ic_launcher"
android:title="menu_2"/>
<item android:id="@+id/menuItem_3"
android:icon="@drawable/ic_launcher"
android:title="menu_3">
<!-- 子菜单 -->
<menu >
<group android:id="@+id/group_2">
<item android:id="@+id/sub_1" android:title="sub_1"/>
<item android:id="@+id/sub_2" android:title="sub_2"/>
<item android:id="@+id/sub_3" android:title="sub_3"/>
</group>
</menu>
</item>
</group>
</menu>
实例化Xml布局文件

使用MenuInflater将main.xml菜单文件与menu绑定起来;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.main, menu);
return true;
}
设置点击监听
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//通过ID来响应菜单项
if (id == R.id.menuItem_1) {
Toast.makeText(MainActivity.this, "menu_1", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}

上下文菜单

上下文菜单是针对某个控件单独设计的。一个页面的上下文菜单可以有很多个,每个控件都可以对应一个,但每个控件也只能有一个上下文菜单。

上下文菜单从产生到处理总共需要经过三个流程:
注册->编写菜单->针对菜单项处理

1) 注册 registerForContextMenu

TextView tvHelloWorld=(TextView)findViewById(R.id.helloword);
registerForContextMenu(tvHelloWorld);//注册上下文菜单

2) 创建菜单

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
//根据View来判断当前要产生哪个Menu
if (v==tvHelloWorld) {
menu.add(0, 0, 0, "tv_menu_1");
menu.add(0, 1, 1, "tv_menu_2");
menu.add(0, 2, 2, "tv_menu_3");
menu.add(0, 3, 3, "tv_menu_4");
}
}

3) 菜单项处理

@Override
public boolean onContextItemSelected(MenuItem item) {
Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
switch (item.getItemId()) {
case 1:
tvHelloWorld.setText("hello kity");
break;
default:
break;
}
return super.onContextItemSelected(item);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星点点-

请我喝杯咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值