Android 实现动态生成菜单

Android 要通过不同的控件生成不同的菜单就必须使用onPrepareOptionsMenu,通过小编的研究得出了如下结论。如一下结论不正确或不完全正确请给我留言,谢谢。


A)onCreateOptionsMenu在何时触发

1. 当手机(Emulator)sdk版本>=11(如我的手机Android Version是4.1.1, Build.VERSION.SDK_INT是16)
在创建Activity时触发。
2. 当手机(Emulator)sdk版本<11(如我的手机Android Version是2.3.4,Build.VERSION.SDK_INT是10)
在第一次单击Menu时触发。


B) onPrepareOptionsMenu在何时触发

当手机(Emulator)sdk版本>=11(如我的手机Android Version是4.1.1, Build.VERSION.SDK_INT是16)
在创建Activity触发onCreateOptionsMenu后触发,
第一次单击Menu时不触发,之后每次单机Menu时触发。
2. 当手机(Emulator)sdk版本<11(如我的手机Android Version是2.3.4,Build.VERSION.SDK_INT是10)
在每次单击Menu时触发。


通过以上的结论我们可以看出当手机(Emulator)sdk版本>=11在Activity创建完成后第一次单击生成菜单的按钮时(如以下例子中的Button2)有可能会出错,这是我们就需要使用invalidateOptionsMenu,调用invalidateOptionsMenu会重新触发onCreateOptionsMenu和onPrepareOptionsMenu方法。


说到这里接下来我们看效果图和代码

2)效果图如下

单击Button1产生的菜单如下


单击Button2产生的菜单如下


3)代码实现如下

package com.example.androidapp;

import android.os.Build;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	private boolean isFirstTrigger=true;
	private int flag=1;
	private Button button1=null;
	private Button button2=null;
	private String TAG="Menu";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.i(TAG, "onCreate");
		setContentView(R.layout.activity_main);
		button1=(Button)findViewById(R.id.button1);
		button1.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				flag=1;
				/*if(Build.VERSION.SDK_INT>=11&&isFirstTrigger){
					menuRefresh();
					isFirstTrigger=false;
				}*/
				openOptionsMenu();
			}
		});
		button2=(Button)findViewById(R.id.button2);
		button2.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				flag=2;
				if (Build.VERSION.SDK_INT >= 11&&isFirstTrigger) {
					menuRefresh();
					isFirstTrigger=false;
				}
				openOptionsMenu();
			}
		});
	}
	/*调用invalidateOptionsMenu会重新触发onCreateOptionsMenu和onPrepareOptionsMenu方法*/
	@SuppressLint("NewApi")
    public void menuRefresh() {
        if (Build.VERSION.SDK_INT >= 11) {//手机或者Emulator的sdk版本
            invalidateOptionsMenu();
        }
    }
	@Override
	/* 1. 当手机(Emulator)sdk版本>=11(如我的手机Android Version是4.1.1, Build.VERSION.SDK_INT是16)
	 * 在创建Activity时触发。
	 * 2. 当手机(Emulator)sdk版本<11(如我的手机Android Version是2.3.4,Build.VERSION.SDK_INT是10)
	 * 在第一次单击Menu时触发。
	 */
	public boolean onCreateOptionsMenu(Menu menu) {
		Log.i(TAG, "onCreateOptionsMenu");
		menu.add(0, 0, 0, "菜单1");  
		menu.add(0, 1, 1, "菜单2"); 
		menu.add(0, 2, 2, "菜单3");  
		menu.add(0, 3, 3, "菜单4"); 
		return true;
	}
	/* 1. 当手机(Emulator)sdk版本>=11(如我的手机Android Version是4.1.1, Build.VERSION.SDK_INT是16)
	 * 在创建Activity触发onCreateOptionsMenu后触发,
	 * 第一次单击Menu时不触发,之后每次单机Menu时触发。
	 * 2. 当手机(Emulator)sdk版本<11(如我的手机Android Version是2.3.4,Build.VERSION.SDK_INT是10)
	 * 在每次单击Menu时触发。
	 * */
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		Log.i(TAG, "onPrepareOptionsMenu");
		menu.findItem(0).setVisible(false);
		menu.findItem(1).setVisible(false);
		menu.findItem(2).setVisible(false);
		menu.findItem(3).setVisible(false);
		if(flag==1){
			menu.findItem(0).setVisible(true);
			menu.findItem(1).setVisible(true);
		}else {
			menu.findItem(2).setVisible(true);
			menu.findItem(3).setVisible(true);
		}
		return super.onPrepareOptionsMenu(menu);
	}
	/*选择MENU里面的内容后触发*/
	@Override
	public boolean onOptionsItemSelected(MenuItem item){  
		Log.i(TAG, "onOptionsItemSelected");
		switch (item.getItemId()) {
		case 0:
			Toast.makeText(this, "菜单1", Toast.LENGTH_LONG)
					.show();
			break;
		case 1:
			Toast.makeText(this, "菜单2", Toast.LENGTH_LONG)
					.show();
			break;
		case 2:
			Toast.makeText(this, "菜单3", Toast.LENGTH_LONG)
					.show();
			break;
		case 3:
			Toast.makeText(this, "菜单4", Toast.LENGTH_LONG)
					.show();
			break;
		default:
			break;
		}
		return true;
	}
}






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值