我使用一个ViewPager和一个FragmentStatePagerAdapter来托管三个不同的片段:

(Fragment1) (Fragment2) (Fragment3)

当我想从FragmentActivity中的ViewPager中获取Fragment1时。

问题是什么,我该如何解决它?


当前回答

在我的案例中,上述解决方案都不起作用。

然而,由于我在一个片段中使用了子片段管理器,下面使用了:

Fragment f = getChildFragmentManager().getFragments().get(viewpage . getcurrentitem ());

只有当管理器中的片段与viewpager项相对应时,这才有效。

其他回答

你不需要在后面的阶段调用getItem()或其他方法来获取托管在ViewPager内部的Fragment的引用。如果你想在Fragment中更新一些数据,那么使用这种方法:动态更新ViewPager ?

关键是在Adaper中设置新数据并调用notifyDataSetChanged(),后者将调用getItemPosition(),传递给你Fragment的引用并让你有机会更新它。所有其他方法都需要你参考自己或其他方法,这不是一个好的解决方案。

@Override
public int getItemPosition(Object object) {
    if (object instanceof UpdateableFragment) {
        ((UpdateableFragment) object).update(xyzData);
    }
    //don't return POSITION_NONE, avoid fragment recreation. 
    return super.getItemPosition(object);
}

这是基于上面Steven的回答。这将返回已经附加到父活动的片段的实际实例。

FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) mViewPager.getAdapter();
    for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {

        Fragment viewPagerFragment = (Fragment) mViewPager.getAdapter().instantiateItem(mViewPager, i);
        if(viewPagerFragment != null && viewPagerFragment.isAdded()) {

            if (viewPagerFragment instanceof FragmentOne){
                FragmentOne oneFragment = (FragmentOne) viewPagerFragment;
                if (oneFragment != null){
                    oneFragment.update(); // your custom method
                }
            } else if (viewPagerFragment instanceof FragmentTwo){
                FragmentTwo twoFragment = (FragmentTwo) viewPagerFragment;

                if (twoFragment != null){
                    twoFragment.update(); // your custom method
                }
            }
        }
    }

我用一种不同的方法简单地实现了这一点。

我的自定义FragmentAdapter。getItem方法返回的不是新的MyFragment(),而是在FragmentAdapter构造函数中创建的MyFragment实例。

在我的活动中,我然后从适配器获得片段,检查它是否是需要的片段的instanceOf,然后强制转换和使用所需的方法。

为了从ViewPager中获取当前可见片段。我用了这个简单的语句,效果很好。

      public Fragment getFragmentFromViewpager()  
      {
         return ((Fragment) (mAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem())));
      }
Fragment yourFragment = yourviewpageradapter.getItem(int index);

Index是fragment在适配器中的位置,比如你先添加fragment1,所以检索fragment1时将Index传递为0,以此类推