FragmentStatePagerAdapter /更新操作栏标题

时间:2013-05-08 19:00:05

标签: android android-fragments android-actionbar android-viewpager

我有一个ViewPager + FragmentStatePagerAdapter的主机活动,让我可以浏览一组片段(同一个ItemFragment类的不同实例),并从网络中提取用于填充每个片段的数据。

现在,当我滑动时,我想用来自当前片段的属性更新操作栏标题,所以我使用OnPageChangeListener / onPageSelected来完成这项工作:

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

我有几个疑问:

  • 我正在检索真正的当前片段吗? FragmentStatePageAdapter没有为每个片段设置标记,所以我不知道任何其他方式来获取当前片段而不是使用ViewGroup容器
  • 当调用onPageSelected时,添加的片段仍然可以获取设置操作栏标题所需的数据,从而导致npe。

在上述场景中保留更新操作栏标题逻辑的最佳位置是什么?

PS。我尝试了一种混合方法,在MyFragment中添加代码,以便在我需要的数据可用时更新ab。问题是前面加载了很少的片段,当片段完成加载时,操作栏标题会发生变化。结果是ab标题是一个随机标题,来自前面几页的片段。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我在ActionBar本身设置了Fragment标题。

@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   

答案 1 :(得分:0)

AFAICT,当新页面设置为"当前"时,应使用PagerAdapter调用setPrimaryItem()。您可以覆盖该方法,链接到超类,然后将Object(第一个参数转换为setPrimaryItem())转换为相应的Fragment类并对其执行某些操作。那"东西"可能会将其存储在PagerAdapter的数据成员中(例如currentPage),并添加一个getter以便以后检索它。