zoukankan      html  css  js  c++  java
  • Android应用开发学习笔记之菜单

    作者:刘昊昱 

    博客:http://blog.csdn.net/liuhaoyutz

    Android中的菜单分为选项菜单(OptionMenu)和上下文菜单(Context Menu)。通常使用菜单资源文件创建菜单。菜单资源文件通常放置在resmenu目录下,这个目录默认情况下是不存在的,需要我们自己创建该目录。菜单资源的根元素通常是<menu></menu>标记,在该标记中可以包含两种子元素:

    1、<item></item>标记,用于定义菜单项。如果某个菜单项中还包括子菜单,可以通过在该菜单项中再包含<menu></menu>标记来实现。

    2、<group></group>标记,用于将多个<item></item>标记定义的菜单包装成一个菜单组。

    一、菜单的创建步骤

    1、  选项菜单

    当用户单击菜单按钮时,弹出的菜单就是选项菜单,创建选项菜单的步骤如下:

    (1)      重写Activity的onCreateOptionsMenu()方法。在该方法中,首先创建一个用于解析菜单资源文件的MenuInflater对象,然后调用该对象的inflate()方法解析一个菜单资源文件,并把解析后的菜单保存在menu中。关键代码如下:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	MenuInflater inflater=new MenuInflater(this);		//实例化一个MenuInflater对象
    	inflater.inflate(R.menu.optionmenu, menu);			//解析菜单文件
    	return true;
    }
    

    (2)      重写onOptionsItemSelected()方法,用于当菜单被选择时,做出相应处理。关键代码举例如下:

    // Called when an options item is clicked
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                    case R.id.menu_setting:
                            Log.d(TAG, "menu item setting is selected.");
                            startActivity(new Intent(this, Settings.class));
                            break;
                    case R.id.menu_history:
                            Log.d(TAG, "menu item history is selected.");
                            startActivity(new Intent(this, History.class));
                            break;
                    case R.id.menu_about:
                            Log.d(TAG, "menu item about is selected.");
                            break;
            }
            return true;
    }
    

    2、  上下文菜单

    当用户在某个控件上长时间按住不放,这时弹出的菜单就是上下文菜单。创建上下文菜单的步骤如下:

    (1)、在Activity的onCreate()方法中注册上下文菜单,例如,为文本框组件注册上下文菜单(也就是说在按住该文本框时,才显示上下文菜单),可以使用下面的代码,:

    TextView tv = (TextView)findViewById(R.id.textView);
    registerForContextMenu(tv);


    (2)、重写Activity的onCreateContextMenu()方法,在该方法中,首先创建一个用于解析菜单资源的MenuInflater对象,然后调用该对象的inflate()方法解析菜单资源文件,并把解析后的菜单保存在menu中,最后为菜单头设置图标和标题。关键代码如下:

     

    	@Override
    	public void onCreateContextMenu(ContextMenu menu, View v,
    			ContextMenuInfo menuInfo) {
    		MenuInflater inflator=new MenuInflater(this); 	//实例化一个MenuInflater对象
    		inflator.inflate(R.menu.contextmenu, menu); 	//解析菜单文件
    		menu.setHeaderIcon(R.drawable.ic_launcher);		//为菜单头设置图标
    		menu.setHeaderTitle("选择颜色:");			//为菜单头设置标题
    
    	}
    

    (3)、重写onContextItemSelected()方法,用于当菜单被选择时,做出相应处理。关键代码如下:

     

    	@Override
    	public boolean onContextItemSelected(MenuItem item) {
    		switch(item.getItemId()){
    			case R.id.color1:		//当选择红颜色时
    				tv.setTextColor(Color.rgb(255, 0, 0));
    				break;
    			case R.id.color2:		//当选择绿颜色时
    				tv.setTextColor(Color.rgb(0, 255, 0));
    				break;
    			default:
    				tv.setTextColor(Color.rgb(255, 255, 255));
    		}
    		return true;
    	}
    

    二、 菜单应用举例

    下面我们来看一个使用菜单的例子,该程序运行效果如下:



    先来看主布局文件:

     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/phone_name"
            android:textSize="25dp"
            android:gravity="center"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello" />
    
    </LinearLayout>
    

    因为要创建context menu和option menu,所以在res/menu目录下分别创建contextmenu.xml和optionmenu.xml,contextmenu.xml内容如下:

     

    <?xml version="1.0"encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/name1" android:title="苹果"></item>
        <item android:id="@+id/name2" android:title="三星"></item>
        <item android:id="@+id/name3" android:title="联想"></item>
        <item android:id="@+id/name4" android:title="小米"></item>
    </menu>


    optionmenu.xml内容如下:

     

    <?xml version="1.0"encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:id="@+id/default_font" android:title="恢复默认字体" android:alphabeticShortcut="r"></item>
        <item android:id="@+id/font_size" android:title="字体大小" android:alphabeticShortcut="e">
            <menu>
                <group android:id="@+id/font_size_group" android:checkableBehavior="single">
                     <item android:id="@+id/size_20"android:title="20dp"></item>
                     <item android:id="@+id/size_30"android:title="30dp"></item>
                </group>
            </menu>
        </item>
    </menu>


    最后来看主Activity文件,其内容如下:

     

    package com.liuhaoyu;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;
     
    public classMainActivity extends Activity {
        TextViewtext_phone_name;
       
       /** Called when the activity is firstcreated. */
       @Override
       publicvoidonCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           
            text_phone_name = (TextView)findViewById(R.id.phone_name);
            registerForContextMenu(text_phone_name);
           
       }
     
        @Override
        public booleanonContextItemSelected(MenuItem item) {
            // TODO Auto-generated method stub
            switch(item.getItemId())
            {
            case R.id.name1:
                text_phone_name.setText("苹果");
                break;
            case R.id.name2:
                text_phone_name.setText("三星");
                break;
            case R.id.name3:
                text_phone_name.setText("联想");
                break;
            case R.id.name4:           
                text_phone_name.setText("小米");
                break;
            default:
                text_phone_name.setText("请选择手机品牌");
            }
            return super.onContextItemSelected(item);
        }
     
        @Override
        public voidonContextMenuClosed(Menu menu) {
            // TODO Auto-generated method stub
            super.onContextMenuClosed(menu);
            Toast.makeText(MainActivity.this, "context menu close",Toast.LENGTH_SHORT).show();
        }
     
        @Override
        public voidonCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfomenuInfo) {
            // TODO Auto-generated method stub
            super.onCreateContextMenu(menu,v, menuInfo);
            MenuInflaterinflater = newMenuInflater(this);
            inflater.inflate(R.menu.contextmenu, menu);
            menu.setHeaderIcon(R.drawable.ic_launcher);
            menu.setHeaderTitle("请选择手机品牌");
        }
     
        @Override
        public booleanonCreateOptionsMenu(Menu menu) {
            // TODO Auto-generated method stub
            MenuInflaterinflater=newMenuInflater(this);
            inflater.inflate(R.menu.optionmenu, menu);
            return super.onCreateOptionsMenu(menu);
        }
     
        @Override
        public booleanonOptionsItemSelected(MenuItem item) {
            // TODO Auto-generated method stub
            if(item.getGroupId()==R.id.font_size_group){
                if(item.isChecked()){               //当菜单项已经被选中
                    item.setChecked(false);         //设置菜单项不被选中
                }else{
                    item.setChecked(true);          //设置菜单项被选中
                }
                if(item.getItemId()==R.id.size_20)
                {
                    text_phone_name.setTextSize(20);
                }
                if(item.getItemId()==R.id.size_30)
                {
                    text_phone_name.setTextSize(30);
                }
            }
            if(item.getItemId()==R.id.default_font)
            {
                text_phone_name.setTextSize(25);
            }
            if(item.getItemId()!=R.id.font_size){
                Toast.makeText(MainActivity.this, item.getTitle(),Toast.LENGTH_SHORT).show();
            }
            return super.onOptionsItemSelected(item);
        }
     
        @Override
        public voidonOptionsMenuClosed(Menu menu) {
            // TODO Auto-generated method stub
            super.onOptionsMenuClosed(menu);
            Toast.makeText(MainActivity.this, "option menu close",Toast.LENGTH_SHORT).show();
        }
       
       
    }


  • 相关阅读:
    [.Net MVC] 使用 log4net 日志框架
    322作业
    uva 12171 sculpture (超级好题)——yhx
    NOIP2007 T2纪念品分组 解题报告-S.B.S.
    NOIP2007 T1奖学金 解题报告-S.B.S.
    NOIP2012普及组 (四年后的)解题报告 -SilverN
    calc 多项式计算 (STL版和非STL版) -SilverN
    uva 10562 undraw the trees(烂题) ——yhx
    uva 10129 play on words——yhx
    uva 10305 ordering tasks(超级烂题)——yhx
  • 原文地址:https://www.cnblogs.com/james1207/p/3263079.html
Copyright © 2011-2022 走看看