解決android4.0系統中菜單(Menu)添加Icon無效問題

來源:互聯網
上載者:User

標籤:

在Android4.0系統中,建立菜單Menu,通過setIcon方法給菜單添加表徵圖是無效的,表徵圖沒有顯出來,2.3系統中是可以顯示出來的。這個問題的根本原因在於4.0系統中,涉及到菜單的源碼類 MenuBuilder做了改變,該類的部分源碼如下:

 1 public class MenuBuilder implements Menu {   2 ...   3 private boolean mOptionalIconsVisible = false;   4 ....   5     void setOptionalIconsVisible(boolean visible) {   6         mOptionalIconsVisible = visible;   7     }   8    9     boolean getOptionalIconsVisible() {  10         return mOptionalIconsVisible;  11     }  12 ...  13 }  

 上面的代碼中,mOptionalIconsVisible成員初始值預設為false,這就是為什麼給菜單設定表徵圖沒有效果的原因;所以,只要我們在建立菜單時通過調用setOptionalIconsVisible方法設定mOptionalIconsVisible為true就可以了;這時候問題來了,要想調用該方法,就需要建立MenuBuilder對象,但是,我們是無法在開發的應用程式中建立MenuBuilder這個對象的(MenuBuilder為系統內部的架構類);

   這時候就需要考慮用反射了,在代碼運行建立菜單的時候通過反射調用setOptionalIconsVisible方法設定mOptionalIconsVisible為true,然後在給菜單添加Icon,這樣就可以在菜單中顯示添加的表徵圖了;

  代碼實現如下:

 1 package com.stevenhu.mie;   2    3 import java.lang.reflect.Method;   4    5 import android.app.Activity;   6 import android.os.Bundle;   7 import android.util.Log;   8 import android.view.Menu;   9 import android.view.MenuItem;  10   11 public class MainActivity extends Activity   12 {  13     /** Called when the activity is first created. */  14     @Override  15     public void onCreate(Bundle savedInstanceState)  16     {  17         super.onCreate(savedInstanceState);  18         setContentView(R.layout.main);  19     }  20   21     @Override  22     public boolean onCreateOptionsMenu(Menu menu)  23     {  24         //運行時,參數Menu其實就是MenuBuilder對象   25         Log.d("MainActivity", "menu--->" + menu);  26           27         /*利用反射機制調用MenuBuilder的setOptionalIconsVisible方法設定mOptionalIconsVisible為true, 28          * 給菜單設定表徵圖時才可見 29          */  30         setIconEnable(menu, true);  31           32         MenuItem item1 = menu.add(0, 1, 0, R.string.item1);  33         item1.setIcon(R.drawable.camera);  34           35         MenuItem item2 = menu.add(0, 1, 0, R.string.item2);  36         item2.setIcon(R.drawable.dial);  37           38         MenuItem item3 = menu.add(0, 1, 0, R.string.item3);  39         item3.setIcon(R.drawable.sms);  40           41         return super.onCreateOptionsMenu(menu);  42     }  43   44     @Override  45     public boolean onPrepareOptionsMenu(Menu menu)   46     {  47         // TODO Auto-generated method stub   48         return super.onPrepareOptionsMenu(menu);  49     }  50       51     //enable為true時,菜單添加表徵圖有效,enable為false時無效。4.0系統預設無效   52     private void setIconEnable(Menu menu, boolean enable)  53     {  54         try   55         {  56             Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");  57             Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);  58             m.setAccessible(true);  59               60             //MenuBuilder實現Menu介面,建立菜單時,傳進來的menu其實就是MenuBuilder對象(java的多態特徵)   61             m.invoke(menu, enable);  62               63         } catch (Exception e)   64         {  65             e.printStackTrace();  66         }  67     }  68 }  

通過上面的代碼,就可以實現在Android4.0系統中設定菜單的Icon有效了

 

解決android4.0系統中菜單(Menu)添加Icon無效問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.