Android应用开发学习笔记之菜单
来源:互联网 发布:刘义军 知乎 编辑:程序博客网 时间:2024/05/01 15:22
作者:刘昊昱
博客: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(); } }
- Android应用开发学习笔记之菜单
- Android应用开发学习笔记之Selector
- Android应用开发学习笔记之进度条
- Android应用开发学习笔记之startActivityForResult
- Android应用开发学习笔记之Fragment
- Android应用开发学习笔记之Intent
- Android应用开发学习笔记之绘图
- Android应用开发学习笔记之ContentProvider
- Android应用开发学习笔记之AsyncTask
- Android应用开发学习笔记之Service
- Android应用开发学习笔记之BroadcastReceiver
- Android应用开发之android菜单
- Android应用开发学习笔记之开发自定义UI组件
- android开发笔记之 仿优酷圆形菜单
- Android应用开发入门经典学习笔记06--动作栏和菜单导航
- Android应用开发学习笔记
- Android应用开发学习笔记之表格布局
- Android应用开发学习笔记之帧布局
- luence之全文检索
- POJ 1903 & ZOJ 2469 & UVA 1326 Jurassic Remains (部分枚举)
- 京东商城发现了一枚Bug
- (原创)3.2 AddOwner和OverrideMetadata的区别
- HBase安装
- Android应用开发学习笔记之菜单
- Ubuntu11.04更新源(转)
- hdu 4006 The kth great number(优先队列)
- LeetCode-Path Sum
- SpringMVC+mybatis+DWR3注解
- 【xinfanqie】笔者分享:教你如何快速关闭磁盘索引
- java先序中序建立二叉树的递归算法
- android ndk 下载地址
- Loaders初步学习