2013-01-11 46 views
28

我只是想通過代碼來調整ActionBar MenuItem的視圖。我的MenuItem的getActionView()返回null

不幸的是,似乎getActionView總是返回null!

我的代碼:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = this.getSupportMenuInflater(); 
    inflater.inflate(R.menu.folder, menu); 
    return super.onCreateOptionsMenu(menu); 

} 

public boolean onPrepareOptionsMenu(final Menu menu) { 
    MenuItem menuFolder = menu.findItem(R.id.menu_folder); 
    Log.i("", "* onPrepareOptionsMenu *" + menuFolder); 
    Log.i("", "* getActionView *" + menuFolder.getActionView()); 

日誌是:

01-11 22:13:42.884:I /(7893):* onPrepareOptionsMenu * com.actionbarsherlock.internal.view。 [email protected]

01-11 22:13:42.884:I /(7893):* getActionView *空

感謝很多的幫助

編輯:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
      android:id="@+id/menu_folder" 
      android:icon="@drawable/ic_menu_archive" 
      android:showAsAction="always"/> 
</menu> 
+0

請顯示'R.menu.folder'。 –

+0

在問題中加入 –

回答

28

getActionView()只有當有來自setActionView定製的actionView工作。

+6

是否有替代方法可以訪問MenuItem的視圖? –

+0

取決於。你想調整這個按鈕,還是所有的按鈕?如果只是這個按鈕,你應該設置一個自定義視圖。如果它的所有按鈕,你應該儘可能使用樣式。你想做什麼改變? –

+2

我想在應用程序中有新內容時在圖標上放置一個「徽章」,所以我需要視圖來添加這個小計數器 –

25

對我來說,工作的解決方案是使用app命名空間,而不是android。

app:actionViewClass="android.support.v7.widget.SearchView"

不要忘了將它聲明: xmlns:app="http://schemas.android.com/apk/res-auto"

+0

您也可以使用actionLayout屬性來設置自定義佈局。在我的例子中,我使用了一個我自己定義的xml中的Spinner。 –

21

你應該使用,如果你使用

android:actionLayout="@layout/menu_actionbar_basket" 

你總是

app:actionLayout="@layout/menu_actionbar_basket" 

那招 得到空在默認工具欄中例外。

+0

謝謝@Smartiz,你節省了我的時間;) – immodi

3

如果您的調試版本沒有任何問題,並且問題只與發佈版本有關,那麼這可能是因爲proguard配置。如果您在應用程序中啓用了proguard,然後將下面的代碼行添加到proguard-rules.pro

-keep class android.support.v7.widget.SearchView { *; }