Android 菜单

菜单的创建并不复杂,关键是要能从整体把握菜单的机制。“坚实的框架”宏观介绍,“详细说明”对一些关键进行说明,“代码示例”帮助理解。

一,坚实的框架

res/menu/**.xml , 资源文件,是创建菜单的一种方式,另一种是直接用代码动态添加。

Activity.onCreateOptionsMenu() ,Activity.onCreateContextMenu(),创建选项菜单和上下文菜单的函数,程序启动时才执行这个函数,所以只能执行一次,如果想更改菜单,要用下一个函数。

Activity.onPrepareOptionsMenu() ,显式菜单前执行这个函数。(貌似木有onPrepareContextMenu()函数 !!)。

Activity.onMenuItemSelected(),网上到处都在说执行下面两个函数前先执行这个函数,我试了下,貌似不是这样的。。。难道我错了?

Activity.onOptionsMenuSelected(),选项菜单的处理。

Activity.onContextMenuSelected(),上下文菜单的处理。

Activity.onOptionsMenuClosed,在选项菜单关闭时被调用。

Activity.onContextMenuClosed,在上下文菜单关闭时调用。

二,详细说明

1,getMenuInflater().inflate(args);从资源文件创建菜单。

2,menu.add(args);动态创建菜单。

3,item一些重要属性:

(1).资源文件实现子菜单

子菜单通过在item元素中嵌套menu来实现。

复制代码
<item android:title="系统设置">
<menu>
<item android:id="@+id/mi_display_setting"
android:title
="显示设置"/>
<item android:id="@+id/mi_network_setting"
android:title
="网络设置"/>
<!-- 别的菜单项 -->
</menu>
</item>
复制代码

(2).为菜单项添加图标

<item android:id="@+id/mi_exit"
android:title
="退出"
android:icon
="@drawable/exit"/>

(3).设置菜单项的可选出现

使用android:checkableBehavior设置一组菜单项的可选策略,可选值为:none, all, single

<group android:id="..."
android:checkableBehavior
="all">
<!-- 菜单项 -->
</group>

使用android:checked设置特定菜单项

<item android:id="..."
android:title
="sometitle"
android:checked
="true"/>

(4).设置菜单项可用/不可用

<item android:id="..."
android:title
="sometitle"
android:enabled
="false"/>

(5).设置菜单项可见/不可见

<item android:id="..."
android:title
="sometitle"
android:visible
="false"/>

三,代码示例

定义菜单的main.xml资源文件

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

    <group 
        android:id="@+id/group1">
        <item
            android:id="@+id/item11"
            android:title="item11"></item>
        <item 
            android:id="@+id/item12"
            android:title="item12"></item>
    </group>
    <group 
        android:id="@+id/group2"
        android:checkableBehavior="all" >  <!-- 改组的所有项都可选 -->
        <item
            android:id="@+id/item_21"
            android:title="item21"
            android:visible="false"></item>  <!-- 该项不可见 -->
        <item 
            android:id="@+id/item22"
            android:title="item22"
            android:enabled="false"></item> <!-- 该项不可用 -->
        <item 
            android:id="@+id/item23"
            android:title="item23"
            android:checked="true"></item>  <!-- 该项已被选中 -->
    </group>

</menu>

MainActivity.java文件

package com.example.androidtest;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button btn = (Button) findViewById(R.id.btn_1);
        btn.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
            {
                //super.onCreateContextMenu(menu, v, menuInfo);
                CreateMenu(menu);
            }
            
        });
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);  // 从xml资源文件创建
        CreateMenu(menu);  // 用代码动态创建
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        Log.w("Trace", "onOptionsItemSelected");
        return MenuChoice(item);  
    }
    
    private void CreateMenu(Menu menu)
    {
        MenuItem item1 = menu.add(0, 0, 0, "menu_item_1"); // 用add添加item,返回item
        MenuItem item2 = menu.add(0, 1, 1, "menu_item_2");
        MenuItem item3 = menu.add(0, 2, 2, "menu_item_3");
        MenuItem item4 = menu.add(0, 3, 3, "menu_item_4");
        {
            Intent intent = new Intent(this, MenuActivity.class);
            item4.setIntent(intent);
        }  // 从网上看到说如果不在onOptionsItemSelected()等里面处理事件,就默认用绑定的事件作响应。但是,这里没看到效果
        
    }
    
    private boolean MenuChoice(MenuItem item)
    {
        
        switch( item.getItemId() )
        {
        case 0:
            Toast.makeText(this, "click on menu_item_1", Toast.LENGTH_SHORT).show();
            return true;
        case 1:
            Toast.makeText(this, "click on menu_item_2", Toast.LENGTH_SHORT).show();
            return true;
        case 2:
            Toast.makeText(this, "click on menu_item_3", Toast.LENGTH_SHORT).show();
            return true;
        // 将3的处理使用绑定的活动,但是没效果,不知为什么??
//        case 3:
//            Toast.makeText(this, "click on menu_item_4", Toast.LENGTH_SHORT).show();
//            return true;
        // 对资源文件中的item的处理方法很多,这里使用id,值得注意的是这里的id和用add方法添加的item的id本质相同。
        case R.id.item11:
            Toast.makeText(this, "click on item11 from xml", Toast.LENGTH_SHORT).show(); 
            return true;
        }
        
        return false;
    }
    
//    @Override
//    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
//    {
//        super.onCreateContextMenu(menu, v, menuInfo);
//        CreateMenu(menu);
//    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        Log.w("Trace", "onContextItemSelected");
        switch(item.getItemId() )
        {
        case 0:
            Toast.makeText(this, "menu_item_1 in context menu", Toast.LENGTH_SHORT).show();
            return true;
        case 1:
            Toast.makeText(this, "menu_item_2  in context menu", Toast.LENGTH_SHORT).show();
            return true;
        case 2:
            Toast.makeText(this, "menu_item_3  in context menu", Toast.LENGTH_SHORT).show();
            return true;
        case 3:
            Toast.makeText(this, "menu_item_4  in context menu", Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }


}
原文地址:https://www.cnblogs.com/wolf-bing/p/3149492.html