Android应用开发学习笔记之菜单

作者:刘昊昱 

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

 

Android中的菜单分为选项菜单(OptionMenu)和上下文菜单(Context Menu)。通常使用菜单资源文件创建菜单。菜单资源文件通常放置在res\menu目录下,这个目录默认情况下是不存在的,需要我们自己创建该目录。菜单资源的根元素通常是<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;

	}

 

 

 

二、 菜单应用举例

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

Android应用开发学习笔记之菜单

Android应用开发学习笔记之菜单

Android应用开发学习笔记之菜单


 

先来看主布局文件:

 

<?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();

    }

   

   

}


 

 

你可能感兴趣的:(android)