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产生的菜单如下
![](https://img-my.csdn.net/uploads/201308/29/1377758805_6236.jpg)
单击Button2产生的菜单如下
![](https://img-my.csdn.net/uploads/201308/29/1377758806_9452.jpg)
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;
-
-
-
-
- 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();
- }
- });
- }
-
- @SuppressLint("NewApi")
- public void menuRefresh() {
- if (Build.VERSION.SDK_INT >= 11) {
- invalidateOptionsMenu();
- }
- }
- @Override
-
-
-
-
-
- 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;
- }
-
-
-
-
-
-
- @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);
- }
-
- @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;
- }
- }