android 细节之 menu 之 invalidateOptionsMenu

来源:互联网 发布:unity3d资源 编辑:程序博客网 时间:2024/05/14 04:03

转自:http://blog.csdn.net/yiding_he/article/details/38410151


menu 在 android中是个非常常用的控件,以前自己做项目的时候通常都是将系统的menu相关方法在activity中直接删去,并且将主题换为fullscreen,然后再在layout中引入自己画好的新的标题栏。

实际上有更好的方法。

并不需要将系统方法删去,只需要将系统menu加上自己的图片,例如:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <item  
  5.         android:id="@+id/menu_edit"  
  6.         android:icon="@drawable/ic_edit"  
  7.         android:showAsAction="always"  
  8.         android:title="@string/common_menu_edit"/>  
  9.   
  10. </menu>  


[java] view plain copy
  1. @Override  
  2.     public boolean onCreateOptionsMenu(Menu menu) {  
  3.         getMenuInflater().inflate(R.menu.menu_card_details, menu);  
  4.         tintMenuItems(menu);  
  5.         return true;  
  6.     }  
  7.   
  8.     @Override  
  9.     public boolean onPrepareOptionsMenu(Menu menu) {  
  10.         menu.findItem(R.id.menu_edit).setEnabled(mIsCardDetailsLoaded);  
  11.         return true;  
  12.     }  
  13.   
  14.     @Override  
  15.     public boolean onOptionsItemSelected(MenuItem item) {  
  16.         switch (item.getItemId()) {  
  17.         case R.id.menu_edit:  
  18.             Intent intent = prepareIntent(EditCardActivity.classfalse);  
  19.             intent.putExtra(IntentExtra.UNIFIED_CARD, mUnifiedCard);  
  20.             startActivityForResult(intent, Ids.Request.EDIT_PAYMENT_CARD);  
  21.             return true;  
  22.   
  23.         default:  
  24.             return super.onOptionsItemSelected(item);  
  25.         }  
  26.     }  


3.2运行时改变Menu ItemonCreateOptionsMenu()只有在menu刚被创建时才会执行,因此要想随时动态改变OptionMenu就要实现onPrepareOptionsMenu()方法,该方法会传给你Menu对象,供使用
Android2.3或更低的版本会在每次Menu打开的时候调用一次onPrepareOptionsMenu().
Android3.0及以上版本默认menu是打开的,所以必须调用invalidateOptionsMenu()方法,然后系统将调用onPrepareOptionsMenu()执行update操作。


这样就可以实现我们的自定义菜单,简单方便。


虽然我觉得自己在主layout中包裹一个layout用来做标题栏也很方便,但是最近的实际开发中,前辈们貌似都是用我刚才提到的方法来做菜单,特记之。


0 0