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;
}
}