2012-08-23 108 views
37

我對我最後的問題提供了很有幫助的提示,我希望這次不會有所不同:)首先,讓我解釋一下情況。我有一個有2個片段的活動。對於每個片段,我都有一個xml菜單佈局,第一個菜單項有四個菜單項,第二個菜單項只有一個菜單項。現在首先加載帶有四個菜單條目的片段。 在其onCreate方法我設置片段中的菜單不顯示

this.setHasOptionsMenu(true); 

的onCreateOptionsMenu方法

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.menu_fragshow, menu); 
} 

的xml文件看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/menu_refresh" 
     android:icon="@drawable/ic_action_search" 
     android:title="Refresh" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" /> 
<item android:id="@+id/menu_clearall" 
     android:icon="@drawable/ic_action_search" 
     android:title="Clear" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" /> 
<item android:id="@+id/menu_addcontent" 
     android:icon="@drawable/ic_action_search" 
     android:title="Add Content" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" /> 
<item android:id="@+id/menu_newlist" 
     android:icon="@drawable/ic_action_search" 
     android:title="New List" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" />  
</menu> 

這工作得很好。所有菜單項都在那裏,我可以點擊它們並做出迴應。現在,當我點擊「添加內容」菜單時,其他片段被加載。在那裏,我也設置

this.setHasOptionsMenu(true); 

的onCreateOptionsMenu方法

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { 
    Log.i("FragCreateList","onCreateOptionsMenu called"); 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.menu_fragcreatelist, menu); 
} 

的xml文件

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/menu_editdone" 
     android:icon="@drawable/ic_action_search" 
     android:title="Edit Done" 
     android:visible="true" 
     android:showAsAction="ifRoom|withText" />   
</menu> 

但在新的片段我看不到任何菜單項。無論是在操作欄中,還是在按下硬件菜單按鈕時。在前一個片段中,兩個菜單項位於操作欄中,其餘兩個菜單項在按下硬件按鈕時出現。但是這裏沒有顯示。我得到了onCreateOptionsMenu方法調用的logcat消息,但沒有任何反應。 (我甚至打電話給我的(空)onPrepareOptionsMenu方法,這應該在菜單顯示之前調用,仍然沒有)任何線索可能是什麼錯誤?調用invalidateOptionsMenu不會做任何事情。此外,我不知道要調用哪一個,因爲有一個getActivity()。invalidateOptionsMenu和一個getFragmentManager()。invalidateOptionsMenu ... 在此先感謝。

編輯:

<uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="15" /> 
+0

從答案,這似乎是這可能是由許多事情造成的。我有這個問題,因爲我使用的是FragmentActivity代替AppCompatActivity的,它爲我改變了 – TallChuck

回答

0

嘗試在碎片onCreateOptionsMenu改變onPrepareOptionsMenu,我有同樣的問題,據我記得這解決了這個問題對我來說...

+0

改成了\t @覆蓋 \t公共無效onPrepareOptionsMenu(菜單菜單){ \t \t Log.i(「FragCreateList儘快制定「,」onPrepareOptionsMenu called「); \t \t MenuInflater inflater = new MenuInflater(getActivity()); \t \t inflater.inflate(R.menu.menu_fragcreatelist,menu); \t \t \t}但仍然沒有...沒有顯示。 –

+0

奇怪的是,我有兩個片段的活動,經典模式,活動本身有一個菜單,每個片段都有自己的菜單。我有onCreateOptionsMenu在活動和onPrepareOptionsMenu在片段。 我的三個菜單都顯示在一起... – Dimanoid

+0

也許我們誤解了,我不希望所有的菜單合併,我希望這兩個單獨的菜單顯示在兩個單獨的片段中,但只有一個片斷顯示菜單。我第一次在我的活動中使用了onCreateOptions,但將所有內容都移動到碎片中,因爲我認爲它更有意義。我剛剛用不同的設計方法解決了我的問題,但我想知道它爲什麼不起作用:)感謝您的努力。 –

2

當選擇註冊/上下文菜單中的碎片,您通常需要等待onActivityCreated()調用以確保有一個活動將菜單綁定到。嘗試修復這裏建議,看看是否有幫助:充氣菜單之前

Context menu from a ListFragment

+0

嗨jsmith,這是關於上下文菜單,我正在分別討論操作欄菜單項或硬件按鈕菜單項。 –

+2

是的,我明白了。在閱讀這個問題時,它似乎意味着你在片段onCreate中調用setHasOptionsMenu(true)。我建議你將它移動到兩個片段的onActivityCreated()方法。這適用於選項菜單和上下文菜單。 – jsmith

50

使用menu.clear()。

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    menu.clear(); 
    inflater.inflate(R.menu.mnulayout, menu); 
} 
+0

謝謝你,幫助了我。 –

+0

爲我工作 –

+3

+1請注意,超級調用必須高於清除和膨脹方法。否則它會以溢出模式顯示。 – Praveen

8

我有同樣的問題。我固定它通過在應用到對myApp背景項目使用showAsAction:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:myapp="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/action_refresh" 
      android:icon="@drawable/ic_refresh" 
      android:title="refresh" 
      android:visible="true" 
      myapp:showAsAction="ifRoom|withText"/> 
</menu> 

對不起它是你太晚了,但也可能是其他人有用。

+3

注意:使用'android:showAsAction'在使用支持Fragment時似乎沒有效果,因此使用res-auto設置第二個命名空間非常重要。謝謝您的幫助。 –

+0

+1 @aglour爲這個塊,其他所有設置和使用支持V4埃裏克提到,不能看到如何解決這個問題,否則,謝謝。 – WickedW

72

我加入setHasOptionsMenu(真)在onCreateView,它工作正常

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    setHasOptionsMenu(true); 
    return inflater.inflate(R.layout.my_example_fragment, container, false); 

} 
+3

爲我工作...謝謝 –

+0

是的,它工作。 – venkat

5

這是因爲你的設備有硬件菜單按鈕。因此,變量「sHasPermanentMenuKey」的值在ViewConfiguration hasPermanentMenuKey()中爲真。您必須使用反射將此變量的值設置爲false。例如:

// this method force showing menu button in device with hardware menu button 
private void showOverflowMenu(FragmentActivity activity) { 
    try { 
     ViewConfiguration config = ViewConfiguration.get(activity); 
     Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); 
     if (menuKeyField != null) { 
      menuKeyField.setAccessible(true); 
      menuKeyField.setBoolean(config, false); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

注意:使用的onCreate()活性的這種方法不是在片段的方法的onCreate()。

-1

由於上述建議均未解決我的問題,因此很晚。我的設備(2.3.5)有這樣與選項菜單中選擇一個錯誤的時機問題,我不得不去不同的路線,並使用從活動充氣的onprepare部分創建菜單:

@Override 
public void onPrepareOptionsMenu(Menu menu) 
{ 
    if (Build.VERSION.SDK_INT < 11) { 
     menu.clear(); 
     getActivity().getMenuInflater().inflate(R.menu.message_thread, menu); 
    } 
0

您的活動需求以延伸ActionBarActivity。你可能只有一個擴展Activity。 strong text

4

這實際上適用於我,也可能是您的解決方案。

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    setHasOptionsMenu(true); 
} 
0

用於片類,以便讓你看到你的菜單在任一onCreateView()方法或onCreateAcivity()方法添加 sethasoptionsmenu(真)。 但我將其添加到onCreateView()方法。希望它可以幫助別人

2

首先你的片段必須有在onCreate

setHasOptionsMenu(true); 

,然後你必須檢查你的活動沒有這個NoActionBar類似主題 它有點棘手,但如果你的活動有這個主題並不重要,你打電話setHasOptionsMenu(true)你的片段不會畫她