作者:刘昊昱

博客: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中。关键代码如下:

@Overridepublic 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中,最后为菜单头设置图标和标题。关键代码如下:

@Overridepublic 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()方法,用于当菜单被选择时,做出相应处理。关键代码如下:

@Overridepublic 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();    }      }


更多相关文章

  1. android基础知识13:AndroidManifest.xml文件解析
  2. Android工程的目录结构
  3. Android程序设计逻辑分析之用户事件响应-回调函数的使用
  4. android附件上传下载(图片,语音,视频)
  5. Android测试(五)CTS测试
  6. android开发简单的计算器
  7. Android升级apk签名文件校验
  8. Android中Java根据文件头获取文件类型
  9. android 镜像文件打包和解压

随机推荐

  1. Android(安卓)利用程序实现GPS的打开或关
  2. Android中调用webservice小结
  3. android使用aidl实现进程间通信的实例
  4. Android(安卓)动画
  5. Android中目的地Intent的使用
  6. greendao3.2.0使用方法(超详细)
  7. Android(安卓)clickable 属性问题
  8. 2019-08-20 Android(安卓)线性布局介绍-L
  9. Android内核剖析
  10. 使用Android(安卓)Studio 3.2编译android