使用菜单资源

一、选项菜单的使用

        下面还是通过一个实例来演示菜单资源的使用。本实例定义了一个文件系统的菜单信息,主菜单包括File、Edit和Help三个菜单项。File菜单有New、Open和Save子菜单项;Edit菜单有Cut、Copy和Paste子菜单项;Help菜单有About和Exit子菜单项。其中主菜单分别添加了图标。File子菜单带有快捷键,Edit子菜单采用单选按钮。Help子菜单可用响应单击事件,分别获得帮助和退出程序。

当用户单机菜单按键时,弹出的菜单就是选项菜单。使用菜单资源创建选项菜单的具体步骤如下:

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 super.onCreateOptionsMenu(menu);
}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
	// TODO Auto-generated method stub
	return super.onOptionsItemSelected(item);
}

举例

在工程的res\menu\目录下创建file_menu.xml菜单资源文件。

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item   
        android:title="File" 
        android:icon="@drawable/file"> 
        <menu> 
            <group   
                android:id="@+id/noncheckable_group" 
                android:checkableBehavior="none"> 
                  
                <item   
					android:id="@+id/newFile" 
					android:title="New"   
					android:alphabeticShortcut="n"/> 
                  
                <item   
					android:id="@+id/openFile" 
					android:title="Open"   
					android:alphabeticShortcut="o"/> 
                  
                <item   
					android:id="@+id/saveFile" 
					android:title="Save"   
					android:alphabeticShortcut="s"/> 
            </group> 
        </menu> 
    </item> 
 
    <item android:title="Edit" android:icon="@drawable/edit"> 
        <menu> 
            <group android:id="@+id/edit_group" 
                    android:checkableBehavior="single"> 
                      
                <item android:id="@+id/cut" 
                      android:title="Cut" /> 
                        
                <item android:id="@+id/copy" 
                      android:title="Copy"/> 
                        
                <item android:id="@+id/past" 
                      android:title="Past"/> 
            </group> 
        </menu> 
    </item> 
 
    <item android:title="Help" android:icon="@drawable/help"> 
        <menu> 
            <group android:id="@+id/help_group"> 
                <item android:id="@+id/about" 
                        android:title="About" /> 
                <item android:id="@+id/exit" 
                        android:title="Exit" /> 
            </group> 
        </menu> 
    </item> 
</menu>  


       在工程res\layout\目录下创建一个test_menu.xml布局文件,在该文件中添加一个TextView视图组件用来显示一个提示信息。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical"   
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
      
    <TextView   
        android:text="测试菜单资源"   
        android:id="@+id/menuTextView01"   
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"
		>
	</TextView> 
          
</LinearLayout> 


        在工程的com.amaker.ch03.menu包中创建一个名为TestMenuActivity的Activity类。在该类的顶部声明MenuInflater类,在onCreate()方法中实例化该对象,用来加载菜单XML资源。

public class TestMenuActivity extends Activity {  
		private MenuInflater mi;  
		@Override  
		public void onCreate(Bundle savedInstanceState) {  
				super.onCreate(savedInstanceState);  
				// 设置Activity界面的布局  
				setContentView(R.layout.test_menu);  
				// 实例化MenuInflater对象  
				mi = new MenuInflater(this);  
		}  
} 

覆盖Activity的onCreateOptionsMenu()方法,在其中创建菜单。

/*  
 * 创建菜单  
 */  
public boolean onCreateOptionsMenu(Menu menu) {  
    // 调用MenuInflater的inflate方法,通过配置文件创建菜单  
    mi.inflate(R.menu.file_menu, menu);  
    return true;  
} 

覆盖Activity的onOptionsItemSelected()方法,响应菜单单击事件,当单击About时显示帮助,当单击Exit时退出程序。

@Override // 菜单项的单击事件  
   public boolean onOptionsItemSelected(MenuItem item) {  
    switch (item.getItemId()) {  
       // 显示关于对话框  
    case R.id.about:  
        aboutAlert("本实例演示的是如何使用XML菜单资源来定义菜单!");  
        break;  
       // 显示退出对话框  
    case R.id.exit:  
        exitAlert("真的要退出吗?");  
        break;  
    }  
    return true;  
   }  
     
// 显示对话框  
private void exitAlert(String msg){  
        // 实例化AlertDialog. Builder  
        AlertDialog.Builder builder = new AlertDialog.Builder(this);  
        // 设置显示信息  
        builder.setMessage(msg)  
           .setCancelable(false)  
                // 确定按钮  
           .setPositiveButton("确定", new
DialogInterface.OnClickListener() {  
                public void onClick(DialogInterface dialog, int id) {  
                     // 结束Activity  
                   finish();  
               }  
               // 取消按钮  
           }).setNegativeButton("取消", new 
DialogInterface.OnClickListener() {  
               public void onClick(DialogInterface dialog, int id) {  
                   return;  
               }  
           });  
        // 创建对话框  
       AlertDialog alert = builder.create();  
        // 显示对话框  
    alert.show();  
}  
 
// 显示对话框  
private void aboutAlert(String msg){  
         // 实例化AlertDialog. Builder  
         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
         // 设置显示信息  
         builder.setMessage(msg)  
           .setCancelable(false)  
                // 设置确定按钮  
           .setPositiveButton("确定", new DialogInterface.OnClickListener() {  
               public void onClick(DialogInterface dialog, int id) {  
               }  
           });  
         // 创建对话框  
         AlertDialog alert = builder.create();  
         // 显示对话框  
    alert.show();  
} 

运行程序:



二、上下文菜单的使用

        当用户长时间按键不放时,弹出的菜单就是上下文菜单。使用菜单资源创建上下文菜单的具体步骤如下:

1)在Activity的onCreare()方法中,注册上下文菜单。例如,为文本框注册上下文菜单,可以使用如下代码:

TextView tv = (TextView)findViewById(R.id.show);
registerForContextMenu(tv);     //为文本框注册上下文菜单

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

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

3)重写onContentItemSeleted()方法,用于当菜单项被选择时,做出相应的处理。

@Override
public boolean onContextItemSelected(MenuItem item) {
	// TODO Auto-generated method stub
	return super.onContextItemSelected(item);
}

举例

1)在res目录下创建menu目录,并在该目录创建一个名称为contentmenu.xml的菜单资源文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <item android:id="@+id/color1" android:title="红色"></item>
	<item android:id="@+id/color2" android:title="绿色"></item>
	<item android:id="@+id/color3" android:title="蓝色"></item>
	<item android:id="@+id/color4" android:title="橙色"></item>
	<item android:id="@+id/color5" android:title="恢复默认"></item>
</menu>

2)打开默认创建的布局文件activity_main.xml,修改默认添加的TextView文本框,修改代码如下:

<TextView 
	android:id="@+id/show"  
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text="打开菜单……"
	android:textSize="28sp"
	/>

3)在Activity的onCreate()方法中,为文本框注册上下文菜单:

private TextView tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	
	tv = (TextView)findViewById(R.id.show);
	registerForContextMenu(tv);
}

4)在Activity的onCreate()方法中共,重写onCreateContextMenu()方法,在该方法中,首先创建一个用于解析菜单资源文件的MenuInflater对象,然后调用该对象的inflate()方法解析一个菜单资源文件,并把解析后的菜单保存在menu中。

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
		ContextMenuInfo menuInfo) {
	MenuInflater inflater = new MenuInflater(this);
	inflater.inflate(R.menu.contentmenu, menu);
	menu.setHeaderIcon(R.drawable.ic_launcher);
	menu.setHeaderTitle("请选择文字颜色:");
}

5)重写onContextItemSelected()方法,在该方法中,通过switch语句使用用户选择的颜色来设置文本框中显示文字的颜色。

@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;
	case R.id.color3:
		tv.setTextColor(Color.rgb(0, 0, 255));
		break;
	case R.id.color4:
		tv.setTextColor(Color.rgb(255, 180, 0));
		break;	
	default:
		tv.setTextColor(Color.rgb(255, 255, 255));
	}
	return true;
}
效果如下:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值