我想提供一个可扩展的解决方案antonyt的精彩的回答和压倒一切的提FragmentPageAdapter.instantiateItem(View, int)保存到创建的引用Fragments,所以你可以对他们以后做的工作。这也应该与FragmentStatePagerAdapter; 请参阅说明的细节。
下面是一个简单的例子,如何得到一个不依赖于内部设置的Fragments返回的引用。关键是重写和保存在那里的引用,而不是在。
FragmentPagerAdaptertagsFragmentsinstantiateItem()getItem()
public class SomeActivity extends Activity {
private FragmentA m1stFragment;
private FragmentB m2ndFragment;
// other code in your Activity...
private class CustomPagerAdapter extends FragmentPagerAdapter {
// other code in your custom FragmentPagerAdapter...
public CustomPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// Do NOT try to save references to the Fragments in getItem(),
// because getItem() is not always called. If the Fragment
// was already created then it will be retrieved from the FragmentMange
// and not here (i.e. getItem() won't be called again).
switch (position) {
case 0:
return new FragmentA();
case 1:
return new FragmentB();
default:
// This should never happen. Always account for each position above
return null;
}
}
// Here we can finally safely save a reference to the created
// Fragment, no matter where it came from (either getItem() o
// FragmentManger). Simply save the returned Fragment from
// super.instantiateItem() into an appropriate reference depending
// on the ViewPager position.
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
// save the appropriate reference depending on position
switch (position) {
case 0:
m1stFragment = (FragmentA) createdFragment;
break;
case 1:
m2ndFragment = (FragmentB) createdFragment;
break;
}
return createdFragment;
}
}
public void someMethod() {
// do work on the referenced Fragments, but first check if they
// even exist yet, otherwise you'll get an NPE.
if (m1stFragment != null) {
// m1stFragment.doWork();
}
if (m2ndFragment != null) {
// m2ndFragment.doSomeWorkToo();
}
}
}
或者如果你喜欢使用tags而不是类成员变量/引用,Fragments你也可以以相同的方式抓取tags设置FragmentPagerAdapter:注意:这不适用于创建它时FragmentStatePagerAdapter不设置。tagsFragments
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
// get the tags set by FragmentPagerAdapte
switch (position) {
case 0:
String firstTag = createdFragment.getTag();
break;
case 1:
String secondTag = createdFragment.getTag();
break;
}
// ... save the tags somewhere so you can reference them late
return createdFragment;
}
请注意,此方法不依赖于模拟内部tag集合FragmentPagerAdapter,而是使用适当的API来检索它们。这样即使tag未来版本的变化SupportLibrary仍然安全。
不要忘记,根据你的设计Activity,Fragments你正在努力的工作可能还可能不存在,所以你必须null在使用你的参考之前通过检查进行解释。
另外,如果你正在使用FragmentStatePagerAdapter,那么你不想保留对你的强硬引用,Fragments因为你可能有很多这样的引用,而且硬引用会不必要地把它们留在内存中。而应将其保存Fragment在WeakReference变量中而不是标准中。喜欢这个:
WeakReference<Fragment> m1stFragment = new WeakReference<Fragment>(createdFragment);
// ...and access them like so
Fragment firstFragment = m1stFragment.get();
if (firstFragment != null) {
// reference hasn't been cleared yet; do work...
}... 展开详请