• Android菜单(Menu)小结 分类: Android 2015-07-02 23:11 11人阅读 评论(0) 收藏


           菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),今天这讲是OptionsMenu 

    概述

      public boolean onCreateOptionsMenu(Menu menu):使用此方法调用OptionsMenu 。

      public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作。

      public void onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。

      public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。

      public boolean onMenuOpened(int featureId, Menu menu):单打开后发生的动作。

    1 Option Menu 
    这种应该是最常见的,一般手机上都会提供Menu的按钮,对应的就是这个菜单弹出。 
    主要步骤就是复写Activity父类中的onCreateOptionMenu(Menu menu)方法,然后通过Menu的add方法来添加菜单进去。 

    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        menu.add(0, MENU_ITEM_COUNTER, 0, "开始");  
        menu.add(0, MENU_ITEM_COUNTER + 1, 0, "暂停");  
        menu.add(0, MENU_ITEM_COUNTER + 2, 0, "结束");  
      
        return super.onCreateOptionsMenu(menu);  
    }  

    设置好Menu后需要对每一个MenuItem进行定义处理,当用户点击是会调用onOptionsItemSelected(MenuItem item)这个方法,需要对该方法进行重写 

    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        switch (item.getItemId()) {  
        case MENU_ITEM_COUNTER:  
            myTextView.setText("You click " + item.getTitle().toString()  
                    + "Menu");  
            break;  
        case MENU_ITEM_COUNTER + 1:  
            myTextView.setText("You click " + item.getTitle().toString()  
                    + "Menu");  
            break;  
        case MENU_ITEM_COUNTER + 2:  
            myTextView.setText("You click " + item.getTitle().toString()  
                    + "Menu");  
            break;  
        default:  
            break;  
        }  
        return super.onOptionsItemSelected(item);  
    }  
    2.Context Menu 
    翻译过来就是上下文菜单,其实知道Context最好是意会搞开发的都懂的,这个Mnue还是相当有用的,比如对于文件管理器来说一些增删改查就可以摆在ContextMenu中,它其实是实现了一个用户长按点击后弹出的来一个菜单。
    首先,ContextMenu在新建是会调onCreateContextMune(Menu menu)方法,我们需要对它进行复写。

    @Override  
        public void onCreateContextMenu(ContextMenu menu, View v,  
                ContextMenuInfo menuInfo) {  
              
            //设置面积大一点,好点唉  
            myTextView.setText("*******************************
    " + "要大一些看得才清楚的"  
                    + "*******************************
    ");  
              
            //itemId注意不要重复,否则处理起来很蛋疼  
            menu.add(0, MENU_ITEM_COUNTER + 3, 0, "白色");  
            menu.add(0, MENU_ITEM_COUNTER + 4, 0, "红色");  
            menu.add(0, MENU_ITEM_COUNTER + 5, 0, "蓝色");  
      
            super.onCreateContextMenu(menu, v, menuInfo);  
        }  
    然后注册一下

    /要记得在需要的控件上注册上下文菜单  
        registerForContextMenu(myTextView); 
    当用户点击时会调用onContextItemSelected(MenuItem item)方法,对其重写
    @Override  
    public boolean onContextItemSelected(MenuItem item) {  
          
        //根据选择不同,对Text进行不同背景色的显示  
        switch (item.getItemId()) {  
        case MENU_ITEM_COUNTER + 3:  
            myTextView.setBackgroundColor(Color.WHITE);  
            break;  
        case MENU_ITEM_COUNTER + 4:  
            myTextView.setBackgroundColor(Color.RED);  
            break;  
        case MENU_ITEM_COUNTER + 5:  
            myTextView.setBackgroundColor(Color.BLUE);  
            break;  
        default:  
            break;  
        }  
          
        return super.onContextItemSelected(item);  
    }  
    3 Sub Menu 
    个人觉得子菜单的概念应该是从属于以上两个菜单类型的,即两种菜单类型中都可以使用子菜单。 
    实现很简单 
    //申明一个子菜单  
    SubMenu subMenu = menu.addSubMenu("这个是一个子菜单");  
    subMenu.add(0, MENU_ITEM_COUNTER + 6, 0, "这个是子菜单的内容");  
    选项菜单(OptionsMenu)的建立

    一、 使用xml定义Menu

    菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。

    <menu>标签没有任何属性,但可以嵌套在<item>标签中,表示子菜单的形式。不过<item>标签中不能再嵌入<item>标签。

    1.<item>标签的属性含义如下:

    Id:表示菜单项的资源ID

    menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。

    orderInCategor:同种类菜单的排列顺序。该属性需要设置一个整数值。例如menuCategory属性值都为system的3个菜单项(item1、item2和item3)。将这3个菜单项的orderInCategory属性值设为3、2、1,那么item3会显示在最前面,而item1会显示在最后面。

    title:菜单项标题(菜单项显示的文本)

    titleCondensed:菜单项的短标题。当菜单项标题太长时会显示该属性值

    icon:菜单项图标资源ID

    alphabeticShortcut:菜单项的字母快捷键

    numericShortcut:菜单项的数字快捷键

    checkable:表示菜单项是否带复选框。该属性可设计为true或false

    checked:如果菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为true或false

    visible:菜单项默认状态是否可视

    enable:菜单项默认状态是否被激活

    2.<group>标签的属性含义如下:

    id:表示菜单组的ID

    menuCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组

    orderInCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组

    checkableBehavior:设置该组所有菜单项上显示的选择组件(CheckBox或Radio Button)。如果将该属性值设为all,显示CheckBox组件;如果设为single,显示Radio Button组件;如果设为none,显示正常的菜单项(不显示任何选择组件)。要注意的是,Android SDK官方文档在解释该属性时有一个笔误,原文是:

    Whether the items are checkable. Valid values: none, all(exclusive/radiobuttons), single(non-exclusive/checkboxes).

    相反了,正确应该是

    all(non-exclusive/checkboxes),single(exclusive/radiobuttons).

    visible:表示当前组中所有菜单项是否显示。该属性可设置的值是true或false

    enable:表示当前组中所有菜单项是否被激活。该属性可设置的值是true或false

    3.具体使用

    在代码中使用

    public boolenonCreateOptionsMenu(Menu menu){

    MenuInflatemenuInflate = getMenuInflate();

    menuInflate.inflate(R.menu.option_menu,menu);

    returntrue;

    }

    二、使用代码定义Menu

    public boolean onCreateOptionsMenu(Menu menu){  

    // 方法一,用代码构建   

     menu.add(Menu.NONE, Menu.NONE, 1, "菜单1");  

     menu.add(Menu.NONE, Menu.NONE, 2, "菜单2");  

     menu.add(Menu.NONE, Menu.NONE, 3, "菜单3");  

     menu.add(Menu.NONE, Menu.NONE, 4, "菜单4");  

    menu.add(Menu.NONE, Menu.NONE, 5, "菜单5");  

    menu.add(Menu.NONE, Menu.NONE, 6, "菜单6");  

    return true;  

    }  

    三、菜单响应

    重写onOptionsItemSelected(MenuItem item)这个方法就可以做响应的操作了。

    四、实例

    res/menu下的activity_main.xml文件

    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:id="@+id/action_settings1"
            android:orderInCategory="3"
            android:showAsAction="never"
            android:title="系统设置"/>
        <item
            android:id="@+id/action_settings2"
            android:orderInCategory="4"
            android:showAsAction="never"
            android:title="关于"/>
    </menu>
    MainActivity.java文件

    package com.example.menudemo;
    
    import android.app.Activity;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class MainActivity extends Activity {
    	/**
    	 * 表示xx通知ID
    	 */
    	public static final int NOTIFY_ID = 100;
    
    	private Notification.Builder builder; 
    	private PendingIntent contentIntent = null; 
    	private NotificationManager nm;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    	}
    
    	private void notifyMessage(){
    		// 发送通知需要用到NotificationManager对象 
    		nm = (NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);
    		// 消息对象
            Intent notificationIntent = new Intent(this, NotifyActivity.class);
            // PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)
            // 用来获得一个挂起的PendingIntent,让该Intent去启动新的Activity来处理通知
            contentIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, 0); 
    
            // 定制我们要在状态栏显示的通知样式
    		builder = new Notification.Builder(MainActivity.this);
    		builder.setContentIntent(contentIntent)
    		 	.setSmallIcon(R.drawable.ic_launcher)//设置状态栏里面的图标(小图标)                     
    			.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.i5))//下拉下拉列表里面的图标(大图标)        .setTicker("this is bitch!") //设置状态栏的显示的信息
    		 	.setWhen(System.currentTimeMillis())//设置时间发生时间
    		 	.setAutoCancel(true)//设置可以清除
    		 	.setContentTitle("This is ContentTitle")//设置下拉列表里的标题
    		 	.setContentText("this is ContentText");//设置上下文内容
    		
    		// 获得刚才创建的通知对象
    		 Notification n = builder.getNotification();//获取一个Notification
    	     n.defaults = Notification.DEFAULT_SOUND;//设置为默认的声音
    	     
    	     // 通过NotificationManger来发送通知消息
    	     // 参数1通知的ID,参数2发送哪个通知
    	     nm.notify(NOTIFY_ID, n);
    	}
    	
    	public void sendNotifyBtn(View v){
    		notifyMessage();
    	}
    	
    	public void cancelNotifyBtn(View v){
    		NotificationManager manger = (NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);
    		manger.cancel(NOTIFY_ID);
    	}
    }
    
    NotifyActivity.java文件
    package com.example.menudemo;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.NotificationManager;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.os.Bundle;
    
    public class NotifyActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		showDialog();
    	}
    	
    
    	private void showDialog() {
    		// 创建并显示一个对话框
    		AlertDialog.Builder dlg = new AlertDialog.Builder(this);
    		// 自定义Dialog需要自己创建或转换一个View,将其通过下面的方法显示。
    		//dlg.setView(view);
    		
    		// 设置对话框显示样式
    		dlg.setTitle("我是对话框标题");
    		dlg.setMessage("我是对话框内容");
    		dlg.setIcon(R.drawable.ic_launcher);
    		dlg.setPositiveButton("是", new OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				System.out.println("PositiveButton被点击");
    				NotificationManager manger = (NotificationManager)NotifyActivity.this.getSystemService(NOTIFICATION_SERVICE);
    				manger.cancel(MainActivity.NOTIFY_ID);
    			}
    		});
    		dlg.setNegativeButton("否", new OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				System.out.println("NegativeButton被点击");
    			}
    		});
    		dlg.setNeutralButton("取消", new OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				System.out.println("NeutralButton被点击");
    			}
    		});
    		// 不允许用户取消对话框
    		dlg.setCancelable(false);
    		dlg.create();
    
    		// 对话框显示必须要调用 show();
    		dlg.show();
    	}
    
    }

    参考博客:

    http://blog.csdn.net/yuzhongchun/article/details/8956256

    http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html
    参考代码:

    http://download.csdn.net/detail/u010963246/8898159

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    疑问:遍历器 Iterator 接口和生成器函数 Generator 之间的关系?
    2020-03-05:JSX、透传、函数式组件、createElement渲染函数
    疑问:现代浏览器是如何组织模块的?
    2020-03-04:各种遍历方法的区别和 Iterator 遍历器
    2020-03-04:vue-styled-components
    操作系统学习笔记(十一)-- 文件系统管理(下)
    操作系统学习笔记(十)-- 文件系统管理(上)
    操作系统学习笔记(九)-- 虚拟内存管理
    操作系统学习笔记(八)-- 内存管理
    操作系统学习笔记(七)-- 死锁
  • 原文地址:https://www.cnblogs.com/xieping/p/4672367.html
Copyright © 2020-2023  润新知