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