控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

Android 菜单

作者:未知 出处:cnblog 2013年06月24日 阅读:

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

 
一,坚实的框架
 
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;
    }
 
 
}

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统