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

(Fragment1) (Fragment2) (Fragment3)

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

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


当前回答

嘿,我已经回答了这个问题。基本上,你需要重写

实例化对象(ViewGroup容器,int位置)

FragmentStatePagerAdapter的方法。

其他回答

Fragment yourFragment = yourviewpageradapter.getItem(int index);

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

最好的解决方案是使用我们在CodePath中创建的名为SmartFragmentStatePagerAdapter的扩展。按照这个指南,这使得从ViewPager中检索片段和当前选择的片段变得非常容易。它还可以更好地管理嵌入到适配器中的片段的内存。

另一个简单的解决方案:

    public class MyPagerAdapter extends FragmentPagerAdapter {
        private Fragment mCurrentFragment;

        public Fragment getCurrentFragment() {
            return mCurrentFragment;
        }
//...    
        @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            if (getCurrentFragment() != object) {
                mCurrentFragment = ((Fragment) object);
            }
            super.setPrimaryItem(container, position, object);
        }
    }

你不需要在后面的阶段调用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);
}

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

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

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

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