似乎很多查看此问题的人都在寻找引用/Fragments
创建的方法。我想提供此解决方案,而不依赖于此其他答案使用的内部创建。FragmentPagerAdapter
FragmentStatePagerAdapter
tags
作为奖励,此方法也适用于FragmentStatePagerAdapter
。有关更多详细信息,请参见下面的注释。
当前解决方案的问题:依靠内部代码
我在此问题和类似问题上看到的许多解决方案都依赖于Fragment
通过调用FragmentManager.findFragmentByTag()
和模仿内部创建的标记"android:switcher:" + viewId + ":" + id
来获得对现有标记的引用:。问题是您依赖内部源代码,众所周知,内部源代码不能保证永远保持不变。Google的Android工程师可以轻松地决定更改tag
结构,这会破坏您的代码,使您无法找到对现有代码的引用Fragments
。
无需内部解决方案的替代解决方案 tag
这是一个简单的示例,该示例说明如何获取对的Fragments
返回引用FragmentPagerAdapter
,而不依赖于上的内部tags
集合Fragments
。关键是要覆盖instantiateItem()
和保存的引用在那里,而不是在getItem()
。
public class SomeActivity extends Activity {
private FragmentA m1stFragment;
private FragmentB m2ndFragment;
private class CustomPagerAdapter extends FragmentPagerAdapter {
public CustomPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new FragmentA();
case 1:
return new FragmentB();
default:
return null;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
switch (position) {
case 0:
m1stFragment = (FragmentA) createdFragment;
break;
case 1:
m2ndFragment = (FragmentB) createdFragment;
break;
}
return createdFragment;
}
}
public void someMethod() {
if (m1stFragment != null) {
}
if (m2ndFragment != null) {
}
}
}
或者,如果您更喜欢使用tags
而不是类的成员变量/引用,则Fragments
也可以tags
通过FragmentPagerAdapter
相同的方式获取该集合:注意:这不适用于FragmentStatePagerAdapter
该集合,因为tags
在创建它时未设置它Fragments
。
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
switch (position) {
case 0:
String firstTag = createdFragment.getTag();
break;
case 1:
String secondTag = createdFragment.getTag();
break;
}
return createdFragment;
}
请注意,此方法不依赖于模仿内部tag
集合FragmentPagerAdapter
,而是使用适当的API来检索它们。这样,即使您tag
将来的版本发生更改,SupportLibrary
您仍然可以安全使用。
不要忘记,根据您的设计Activity
,Fragments
您正在尝试进行的工作可能存在或可能不存在,因此您必须null
在使用引用之前进行检查以解决这一问题。
另外,如果您正在使用FragmentStatePagerAdapter
,则您不想保留对您的硬引用,Fragments
因为您可能有很多硬引用,而硬引用将不必要地将它们保留在内存中。而是将Fragment
引用保存在WeakReference
变量而不是标准引用中。像这样:
WeakReference<Fragment> m1stFragment = new WeakReference<Fragment>(createdFragment);
Fragment firstFragment = m1stFragment.get();
if (firstFragment != null) {
}