Android FragmentStatePagerAdapter重复片段
我在单活动应用程序上使用嵌套FragmentStatePagerAdapter。当前布局为:Android FragmentStatePagerAdapter重复片段,android,Android,我在单活动应用程序上使用嵌套FragmentStatePagerAdapter。当前布局为: Activitiy - Login Fragment - Master Fragment - Tab Fragment #1 - Tab Fragment #2 - Tab Fragment #3 - Another Fragment - Another Fragment 例如,每次我从“另一个片段”切换回“主片段”时,FragmentStatePa
Activitiy
- Login Fragment
- Master Fragment
- Tab Fragment #1
- Tab Fragment #2
- Tab Fragment #3
- Another Fragment
- Another Fragment
例如,每次我从“另一个片段”切换回“主片段”时,FragmentStatePagerAdapter都会两次实例化同一项
第一次:制表符片段#1#2#3第二次:制表符片段#1#1#2#2#3#3
第三次:制表符片段#1#1#2#2#3#3 要从一个片段移动到另一个片段,我使用
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, XXXX.newInstance(query), TAG_XXX)
.addToBackStack(null)
.commit();
主片段代码:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initFragmentAdapter();
}
private void initFragmentAdapter() {
final FragmentSimpleAdapter adapter = new FragmentSimpleAdapter(getChildFragmentManager());
adapter.addFragment(
getString(...),
"...",
XXX.class);
...
ViewPager viewPager = (ViewPager) getActivity().findViewById(android.R.id.tabcontent);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(4);
PagerSlidingTabStrip viewTabs = (PagerSlidingTabStrip) getActivity().findViewById(
android.R.id.tabhost);
viewTabs.setViewPager(viewPager);
viewTabs.setOnPageChangeListener(adapter);
}
private final class FragmentSimpleAdapter extends FragmentStatePagerAdapter
implements ViewPager.OnPageChangeListener {
private final List<String> mTitles = new LinkedList<>();
private final List<String> mInstances = new LinkedList<>();
private final List<String> mTag = new LinkedList<>();
private Map<Integer, String> mFragmentTags;
private FragmentManager mFragmentManager;
public FragmentSimpleAdapter(FragmentManager fm) {
super(fm);
mFragmentManager = fm;
mFragmentTags = new HashMap<>();
}
@Override
public int getCount() {
return mTitles.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles.get(position);
}
@Override
public Fragment getItem(int position) {
return Fragment.instantiate(getActivity(), mInstances.get(position), null);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
if (obj instanceof Fragment) {
Fragment f = (Fragment) obj;
String tag = f.getTag();
mFragmentTags.put(position, tag);
}
return obj;
}
public Fragment getFragment(int position) {
String tag = mFragmentTags.get(position);
if (tag == null) {
return null;
}
return mFragmentManager.findFragmentByTag(tag);
}
public FragmentSimpleAdapter addFragment(String title, String tag,
Class<? extends Fragment> fragment) {
mTitles.add(title);
mTag.add(tag);
mInstances.add(fragment.getName());
return this;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Analytics.sendViewAnalytic(mTag.get(position))
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
@覆盖
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
initFragmentAdapter();
}
私有void initFragmentAdapter(){
final FragmentSimpleAdapter=新的FragmentSimpleAdapter(getChildFragmentManager());
adapter.addFragment(
getString(…),
"...",
三十、 类);
...
ViewPager ViewPager=(ViewPager)getActivity().findViewById(android.R.id.tabcontent);
viewPager.setAdapter(适配器);
viewPager.setOffscreenPageLimit(4);
PagerSlidingAbstrip视图选项卡=(PagerSlidingAbstrip)getActivity().findViewById(
android.R.id.tabhost);
viewTabs.setViewPager(viewPager);
viewTabs.setOnPageChangeListener(适配器);
}
私有最终类FragmentSimpleAdapter扩展FragmentStatePagerAdapter
实现ViewPager.OnPageChangeListener{
private final List mTitles=new LinkedList();
private final List mInstances=new LinkedList();
私有最终列表mTag=new LinkedList();
私有地图标签;
私人碎片管理器MFFragmentManager;
公共碎片SimpleAdapter(碎片管理器fm){
超级(fm);
MFFragmentManager=fm;
MFFragmentTags=newHashMap();
}
@凌驾
public int getCount(){
返回mTitles.size();
}
@凌驾
公共字符序列getPageTitle(int位置){
返回mTitles.get(位置);
}
@凌驾
公共片段getItem(int位置){
返回Fragment.instantiate(getActivity(),mInstances.get(position),null);
}
@凌驾
公共对象实例化项(视图组容器,int位置){
Object obj=super.instanceItem(容器、位置);
if(obj实例f片段){
片段f=(片段)obj;
String tag=f.getTag();
MFFragmentTags.put(位置,标签);
}
返回obj;
}
公共片段getFragment(int位置){
String tag=MFFragmentTags.get(位置);
if(标记==null){
返回null;
}
返回mffragmentmanager.findffragmentbytag(tag);
}
公共片段SimpleAdapter addFragment(字符串标题、字符串标记、,
班级问题:
PagerSlidingTabStrip viewTabs = (PagerSlidingTabStrip) getActivity().findViewById(
android.R.id.tabhost);
每次您回到主片段的内部时,您都试图重新创建和重新创建PagerSlidingTabStrip
,从而添加不必要的片段
解决方案:
PagerSlidingTabStrip viewTabs = (PagerSlidingTabStrip) getActivity().findViewById(
android.R.id.tabhost);
您需要首先检查选项卡是否已经存在我不知道这是一个定制的类。通过将FragmentSimpleAdapter初始化代码从onActivityCreate移动到onCreate来修复。在片段中嵌套片段时,应该实例化FragmentStatePagerAda使用getChildFragmentManager而不是getFragmentManager。发布主片段。Rod_Algonquin添加。您好,您现在解决问题了吗?删除PagerSlidingAbstrip不会解决问题。ViewPager和NestedFragments似乎有问题,如果我用FragmentPagerAdapter替换FragmentStatePagerAdapter,则不会泄漏。