1

我有一個ViewPager + FragmentStatePagerAdapter我的主機活動這讓我刷卡通過一組片段(同一ItemFragment類的不同實例),並用於填充每個片段的數據是從網上下載的。FragmentStatePagerAdapter /更新操作欄標題

現在,當我刷我想更新與屬性從當前片段來讓我用OnPageChangeListener /使用onPageSelected做這項工作的操作欄標題:

... 
@Override 
public void onPageSelected(int position) { 
    MyFragment currentFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.view_pager); 
    getSupportActionBar().setTitle(currentFragment.propertyIWantToUseAsTitle); 
} 
... 

我有幾個在這裏的疑惑:

  • 我在獲取真實的當前片段?該FragmentStatePageAdapter不設置每個片段的標籤,所以我不知道任何其他方式來獲得當前的片段,而不是使用的ViewGroup容器
  • 被調用時使用onPageSelected,添加的片段可以仍獲取我需要將數據設置導致n的操作欄標題。

在上述場景中,更新操作欄標題的邏輯最好的地方是什麼?

ps。當我需要的數據可用時,我嘗試了添加到MyFragment的混合方法來更新ab。問題在於,在碎片完成加載時,操作欄標題不斷變化,因此很少有碎片被加載。結果是ab標題是來自前幾頁的片段的隨機標題。

在此先感謝您的幫助!

+0

「我在檢索真正的當前片段嗎?」 - 也許現在,但你依賴於'ViewPager'實現細節,這是有風險的。 「FragmentStatePageAdapter不會爲每個片段設置標籤」 - 您僅限於使用「FragmentStatePagerAdapter」嗎? 「在上述場景中保持更新操作欄標題的邏輯的最佳位置是什麼?」 - 是的,我真的需要爲此制定解決方案。它現在正式在我的待辦事項清單上。 – CommonsWare 2013-05-08 22:04:59

+0

謝謝@CommonsWare,我只是讓它工作,但我關心內存使用情況。就拿這裏看看https://gist.github.com/gwvatieri/5544164 – gwa 2013-05-08 22:28:49

回答

0

AFAICT,您的PagerAdapter應該在新頁面設置爲「當前」時調用setPrimaryItem()。您可以重寫該方法,鏈接到超類,然後將Object(第一個參數爲setPrimaryItem())投射到適當的Fragment類,並對其執行相關操作。這個「東西」可能會隱藏在您的PagerAdapter(例如,currentPage)的數據成員中,並添加一個獲取器以便稍後檢索它。

+0

做了一個快速測試,因爲某些原因使用onPageSelected回調有時造成具有上一個或下一個項目的標題的操作欄比setPrimaryItem解僱更早。另外還有引起調用setPrimaryItem延遲(順便說一下它的發射多次)... – gwa 2013-05-09 21:17:11

+0

@gwa:「因爲某些原因使用onPageSelected回調有時比setPrimaryItem燃煤造成早期具有prev的標題或操作欄下一個項目「 - 是嗎?從'setPrimaryItem()'更新操作欄。恐怕我沒有按照你的評論的其餘部分。 – CommonsWare 2013-05-09 22:54:33

+0

好吧,它是有道理的,只是刪除地圖保持對片段的引用。感謝您的幫助。你下週會去參加IO嗎? – gwa 2013-05-09 23:42:23

3

我在Fragment本身設置ActionBar冠軍。

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

    Bundle extras = getActivity().getIntent().getExtras(); 
    type = (String) extras.getString("type"); 
}// end method 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (isVisibleToUser) { 
     Activity activity = getActivity(); 
     ActionBar actionBar = activity.getActionBar(); 

     if (type.equals("one")) { 
      actionBar.setTitle(R.string.one); 
     } 
     if (type.equals("two")) { 
      actionBar.setTitle(R.string.two); 
     } 
     if (type.equals("three")) { 
      actionBar.setTitle(R.string.three); 
     } 
    } 
}//end method