2013-01-23 61 views
23

我有一個活動,顯示一些片段。 活動視圖僅包含使用自定義FragmentPagerAdapter初始化的ViewPager。 此適配器提供3個片段之間的導航。Android:如何在片段更改時重新創建動作欄

除了Action bar之外,它似乎都能正常工作。

我重寫onCreateOptionsMenu()方法在我的片段爲任何片段創建單獨的操作欄:

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

//fragment specific menu creation }

當我刷卡,會出現新的片段,但操作欄保持不變,幾秒鐘。可能在幾秒鐘後調用此方法並更改操作欄。

當刷卡完成後,當操作欄在一段時間內更改時,這看起來很糟糕。 如何在刷卡開始之前立即重新創建操作欄?

回答

26

你可以問機器人重新創建的動作條通過調用invalidateOptionsMenu();

自動執行做到這一點的地方接近的地方,你改變片段,試圖降低片段之間和動作條改變「滯後」前點。

編輯

一個完整的解決方案可能是這樣的:

class activity extends Activity{ 

private void switchFragment(){ 

...do fragment changing stuff 

activity.invalidateOptionsMenu(); 

} 

} 

class someFragment extends Fragment{ 

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


    //fragment specific menu creation 
} 

} 

取片段是在

activity.invalidateOptionsMenu(); 

將調用它的

onCreateOptionsMenu 
開放

,你可以在那裏做特定的片段菜單

+0

問題是我不能找到任何明顯的方式來要求android重新創建操作欄。 –

+0

@Mik我已經更新了我的答案以幫助,但我並不完全瞭解你... invalidateOptionsMenu()應該「請求android重新創建操作欄」 – roarster

+5

謝謝你的回答,但是 1.當你調用.invalidateOptionsMenu();系統並不真正重新創建操作欄。它只會導致在片段中調用onCreateOptionsMenu(),從而允許您更改Menu(這是操作欄的一部分)。如果你在片段中調用了setHasOptionsMenu(true),那麼你甚至不必調用invalidateOptionsMenu(),因爲onCreateOptionsMenu()會自動調用。 2.我無法找到在刷卡之前調用onCreateOptionsMenu()的方法。 –

1

最後我找不到任何聲音的方式來實現這一點。

最好的做法是將操作欄作爲片段的一部分,而不是活動,但這是不可能的。

當刷卡開始時(您可以在PageView中設置特殊偵聽程序)並在刷卡完成並顯示新碎片時再次設置菜單和標題,最終清除操作欄菜單和標題。

In給出了一些時間滯後,並且在滑動過程中操作欄看起來奇怪地爲空,但最好能做到。
Android API is ...

+0

耶穌...糟糕的解決方案! android的架構非常複雜! – Mateus

4

它可以通過執行onCreateOptionsMenu並在每個片段的onAttach回調中調用setHasOptionsMenu(true)並相應地更改操作來完成。

要顯示的片段,沒有任何行動setHasOptionsMenu(假)在它

+0

謝謝你提及'onAttach'和'setHasOptionsMenu'! – Steven

相關問題