ActionBar 中的两个片段 return 对 fragment.isVisible() 都是正确的

Both Fragment in ActionBar return true for fragment.isVisible()

在我的 MainActivityActionBar 中,我从 DialogFragment 收听一个听众,并根据我所在的 ActionBar 片段,我需要做一些东西。

我正在使用以下代码获取当前片段并检查我在两个 ActionBar 片段中的哪一个:

 private Fragment getVisibleFragment() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

fragment.isVisible() returns 这两个片段都是正确的。为什么会这样?我需要考虑另一个标志吗?

下面是我的 FragmentPagerAdapter 实现:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
Context context;
public SectionsPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context = context;
}

@Override
public Fragment getItem(int index) {
    switch (index) {
        case 0:
            return new ReceivedListFragment();
        case 1:
            return new SentListFragment();
    }
    return null;
}

@Override
public int getCount() {
    // Show 2 total pages.
    return 2;
}

@Override
public CharSequence getPageTitle(int position) {
    Locale l = Locale.getDefault();
    switch (position) {
        case 0:
            return context.getString(R.string.title_section1).toUpperCase(l);
        case 1:
            return context.getString(R.string.title_section2).toUpperCase(l);
    }
    return null;
}
}

您似乎正在使用 ViewPager,您需要找出哪个是当前选定的视图。在我看来,您的方法中的问题是 viewpager 保留了至少两个片段的实例。看起来你只有两个片段,这两个片段都由 viewpager 保存,这就是为什么你得到两个片段的 isVisible true 的原因。

如果您只需要在viewpager上获取当前选中的片段,请在viewpager中尝试此方法class:

mViewPagerInstance.getCurrentItem();

这将为您提供当前选定的片段索引。

另一种方法是为您的 viewpager 添加 PageChangeListener,然后监听页面更改事件:

class MyActivity extends Activity{
  private int curPage;

  private static class MFragChangeListener extends SimpleOnPageChangeListener{
        public void onPageSelected(int position) {
               curPage = position;
  }
} 

  ........... /* Rest of your code */

mViewPagerInstance.setOnPageChangeListener(new MFragChangeListener());
/* Now access curPage to get the current selected page index whenever you need it. */

请参考this SO post