Android 实现动态生成菜单

来源:互联网 发布:广州易第优软件科技 编辑:程序博客网 时间:2024/06/06 06:30

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)代码实现如下

[java] view plain copy
  1. package com.example.androidapp;  
  2.   
  3. import android.os.Build;  
  4. import android.os.Bundle;  
  5. import android.annotation.SuppressLint;  
  6. import android.app.Activity;  
  7. import android.util.Log;  
  8. import android.view.Menu;  
  9. import android.view.MenuItem;  
  10. import android.view.View;  
  11. import android.widget.Button;  
  12. import android.widget.Toast;  
  13.   
  14. public class MainActivity extends Activity {  
  15.   
  16.     private boolean isFirstTrigger=true;  
  17.     private int flag=1;  
  18.     private Button button1=null;  
  19.     private Button button2=null;  
  20.     private String TAG="Menu";  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         Log.i(TAG, "onCreate");  
  25.         setContentView(R.layout.activity_main);  
  26.         button1=(Button)findViewById(R.id.button1);  
  27.         button1.setOnClickListener(new Button.OnClickListener() {  
  28.               
  29.             @Override  
  30.             public void onClick(View v) {  
  31.                 flag=1;  
  32.                 /*if(Build.VERSION.SDK_INT>=11&&isFirstTrigger){ 
  33.                     menuRefresh(); 
  34.                     isFirstTrigger=false; 
  35.                 }*/  
  36.                 openOptionsMenu();  
  37.             }  
  38.         });  
  39.         button2=(Button)findViewById(R.id.button2);  
  40.         button2.setOnClickListener(new Button.OnClickListener() {  
  41.               
  42.             @Override  
  43.             public void onClick(View v) {  
  44.                 flag=2;  
  45.                 if (Build.VERSION.SDK_INT >= 11&&isFirstTrigger) {  
  46.                     menuRefresh();  
  47.                     isFirstTrigger=false;  
  48.                 }  
  49.                 openOptionsMenu();  
  50.             }  
  51.         });  
  52.     }  
  53.     /*调用invalidateOptionsMenu会重新触发onCreateOptionsMenu和onPrepareOptionsMenu方法*/  
  54.     @SuppressLint("NewApi")  
  55.     public void menuRefresh() {  
  56.         if (Build.VERSION.SDK_INT >= 11) {//手机或者Emulator的sdk版本  
  57.             invalidateOptionsMenu();  
  58.         }  
  59.     }  
  60.     @Override  
  61.     /* 1. 当手机(Emulator)sdk版本>=11(如我的手机Android Version是4.1.1, Build.VERSION.SDK_INT是16) 
  62.      * 在创建Activity时触发。 
  63.      * 2. 当手机(Emulator)sdk版本<11(如我的手机Android Version是2.3.4,Build.VERSION.SDK_INT是10) 
  64.      * 在第一次单击Menu时触发。 
  65.      */  
  66.     public boolean onCreateOptionsMenu(Menu menu) {  
  67.         Log.i(TAG, "onCreateOptionsMenu");  
  68.         menu.add(000"菜单1");    
  69.         menu.add(011"菜单2");   
  70.         menu.add(022"菜单3");    
  71.         menu.add(033"菜单4");   
  72.         return true;  
  73.     }  
  74.     /* 1. 当手机(Emulator)sdk版本>=11(如我的手机Android Version是4.1.1, Build.VERSION.SDK_INT是16) 
  75.      * 在创建Activity触发onCreateOptionsMenu后触发, 
  76.      * 第一次单击Menu时不触发,之后每次单机Menu时触发。 
  77.      * 2. 当手机(Emulator)sdk版本<11(如我的手机Android Version是2.3.4,Build.VERSION.SDK_INT是10) 
  78.      * 在每次单击Menu时触发。 
  79.      * */  
  80.     @Override  
  81.     public boolean onPrepareOptionsMenu(Menu menu) {  
  82.         Log.i(TAG, "onPrepareOptionsMenu");  
  83.         menu.findItem(0).setVisible(false);  
  84.         menu.findItem(1).setVisible(false);  
  85.         menu.findItem(2).setVisible(false);  
  86.         menu.findItem(3).setVisible(false);  
  87.         if(flag==1){  
  88.             menu.findItem(0).setVisible(true);  
  89.             menu.findItem(1).setVisible(true);  
  90.         }else {  
  91.             menu.findItem(2).setVisible(true);  
  92.             menu.findItem(3).setVisible(true);  
  93.         }  
  94.         return super.onPrepareOptionsMenu(menu);  
  95.     }  
  96.     /*选择MENU里面的内容后触发*/  
  97.     @Override  
  98.     public boolean onOptionsItemSelected(MenuItem item){    
  99.         Log.i(TAG, "onOptionsItemSelected");  
  100.         switch (item.getItemId()) {  
  101.         case 0:  
  102.             Toast.makeText(this"菜单1", Toast.LENGTH_LONG)  
  103.                     .show();  
  104.             break;  
  105.         case 1:  
  106.             Toast.makeText(this"菜单2", Toast.LENGTH_LONG)  
  107.                     .show();  
  108.             break;  
  109.         case 2:  
  110.             Toast.makeText(this"菜单3", Toast.LENGTH_LONG)  
  111.                     .show();  
  112.             break;  
  113.         case 3:  
  114.             Toast.makeText(this"菜单4", Toast.LENGTH_LONG)  
  115.                     .show();  
  116.             break;  
  117.         default:  
  118.             break;  
  119.         }  
  120.         return true;  
  121.     }  
  122. }  
0 0
原创粉丝点击