2013-05-12 91 views
11

我有一個簡單的應用程序與選項菜單,它在片段的開始處發生變化。 問題是,除了第一次onCreateOptionsMenu()調用兩次 - onCreate()內和onResume()後,開始的任何片段。 在onCreate()我通過setHasOptionsMenu(true)將其稱爲manualy,但在onResume()之後它不應該發生。 此外,這隻發生在第一個片段開始後。onCreateOptionsMenu()在片段中調用兩次

這裏是鹼基片段代碼:

class BaseFragment extends Fragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle clicks 
     return true; 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Create a menu 
     super.onCreateOptionsMenu(menu, inflater); 
    } 
} 

而在活動中的變化的代碼片段:

public void startFragment(BaseFragment fragment) { 
    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(android.R.id.content, fragment) 
    .commit(); 
} 

該示例不使用像ActionBarSherlock,僅SupportLibrary任何外部庫。 我想,問題出在FragmentTransaction的replace()方法,因爲它在第一個片段開始時工作正常。但我不知道,從哪裏開始解決問題。我需要在View中完全替換片段。

+0

您正在使用哪款手機?如果手機有一個專門的菜單按鈕,onCreateOptionsMenu將僅在用戶點擊該按鈕時被調用。添加它不是強制性的,setHasOptionsMenu(true)應該調用onCreateOptionsMenu。它只是通知框架,當填充菜單時片段想要參與。 – prijupaul 2013-09-25 06:08:08

+0

當我遇到同樣的問題時,OP甚至不會讓我添加/編輯問題。我知道關於Menu的基本內容,這個問題與OP描述的一樣很奇怪。 編輯:我使用嵌套片段 – Zyoo 2013-09-25 08:35:58

+0

@prijupaul它實際上只適用於前蜂窩版本。在調用setHasOptionsMenu()之後,在Honeycomb和稍後onCreateOptionsMenu將立即調用。 – bvitaliyg 2013-09-25 15:10:46

回答

-1

如果你不處理菜單項,你應該調用onOptionsItemSelected()的超類實現(默認實現返回false)。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 
+0

爲什麼降低投票?它有什麼錯誤。 – 2013-09-25 05:54:39

+0

我認爲它的問題是使用onCreateOptionsMenu,而你的答案是使用onResume,它不適合onCreateOptionMenu和生命週期。 – prijupaul 2013-09-25 06:04:00

+0

沒有。它不是手動調用的。當調用setHasOptionsMenu(true)時,它只是通知框架片段有菜單。適當時,框架會調用所需的功能。如果這沒有設置爲true,框架將不會調用片段中的oncreateoptionsmenu。 – prijupaul 2013-09-25 06:15:19

2

我想新添加的片段會導致活動onCreateOptionsMenu再次被調用!

1>嘗試添加

setRetainInstance(真);

to fragment constructor!

public BaseFragment() 
{ 
    setRetainInstance(true); 
    setHasOptionsMenu(true); 
} 

,這會節省/旋轉時恢復每個片的各個狀態

這個問題似乎是相關的事實,當活動被銷燬的Android不破壞片段(時設備旋轉)。

我發現這個這裏Jake Wharton在SO

更新: 2>另一種方式是避免增加對佈局文件中的片段,並且還通過調用構造/ newInstance方法手動實例化它們。

如果你在佈局上添加一個片段,android框架會爲你實例化它。 而不是手動實例化片段,您應該通過調用FragmentManager.getFragmentById來檢索它的實例,並改爲使用該實例。

所以始終包含您的片段

3>試着用這個ID和/或標籤通過調用menu.clear()

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

    } 
+1

不,我不認爲這是答案。當然,我嘗試了上面所說的所有內容,但每當我測試它時它都會發生 – Zyoo 2013-09-25 08:33:20

+0

@Zyoo爲您的問題提供了其他解決方案嗎? – 2013-11-20 06:27:41

+0

對不起,我決定不使用optionmenu,但我認爲將來它會被需要,所以我仍然試圖 – Zyoo 2013-11-20 14:51:13

0

也許你可以嘗試這樣的:

private final int MENU_SEARCH=Menu.FIRST; 
: 
    @Override public void onPrepareOptionsMenu(Menu menu) { 
     if (menu.findItem(MENU_SEARCH)==null) { 
      menu.add(0, MENU_SEARCH, Menu.NONE, getText(R.string.menu_search)); 
: 

iee檢查菜單中是否存在其中一個菜單項,如果不存在,則可能需要添加所有菜單項。

7

我知道我遲到了,但遇到同樣發出─和我的解決方案實際上是明確添加

setHasOptionsMenu(false); 

我SupportFragments的onCreate功能。這可以防止對活動onCreateOptionsMenu和onPrepareOptionsMenu的額外調用。希望這可以幫助。

2

解決問題的最簡單方法是在充氣之前清除菜單。

menu.clear()將清除任何現有的菜單,並開始一個新的菜單。

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