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";@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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时触发。 * */@Overridepublic 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里面的内容后触发*/@Overridepublic 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;}}




更多相关文章

  1. android的上下文菜单
  2. eclipse 调试手机Android
  3. 说说 Android 中如何实现同时兼容手机与平板的新闻应用界面
  4. Android手机拨打电话、手动发送短信与自动拨打电话、自动发送短
  5. Android----菜单的使用
  6. 【Android】不弹root请求框检测手机是否root
  7. Android 取得手机屏幕大小
  8. Android高手进阶教程(六)之----Android 中MenuInflater的使用(布

随机推荐

  1. Android库. 1 UDP客户端
  2. android下拉菜单——选择星座
  3. 很好的Android论坛
  4. android 开源项目(城市定位)
  5. Android中获取当前进程名称
  6. 关于Android中xstreamjar冲突
  7. Android 自定义时间选择器
  8. 如何在android中使用你自己的数据文件
  9. android studio 53 mp3
  10. android 单选,复选按钮,以及toast