1

我有一个带有 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 的操作栏标题的数据。

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

附言。我尝试了一种混合方法,将代码添加到 MyFragment 以在我需要的数据可用时更新 ab。问题是很少有片段被提前加载,并且随着片段完成加载而动作栏标题发生变化。结果是 ab 标题是来自前面几页片段的随机标题。

提前感谢您的帮助!

4

2 回答 2

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   
于 2013-05-09T11:53:33.360 回答
0

AFAICT,当新页面设置为“当前”时,您PagerAdapter应该被调用。setPrimaryItem()您可以覆盖该方法,链接到超类,然后将Object(第一个参数 to setPrimaryItem())转换为适当的Fragment类并对其进行处理。那个“东西”可能把它藏在你PagerAdapter(例如,currentPage)的一个数据成员中,并添加一个 getter 以便以后能够检索它。

于 2013-05-09T11:31:05.700 回答