【问题标题】:FragmentManager contains fragment from viewpager after state lossFragmentManager 包含状态丢失后来自 viewpager 的片段
【发布时间】:2015-08-13 01:09:08
【问题描述】:

在状态丢失或屏幕旋转时,当我的布尔标志为真时,我想重新创建我的屏幕。但是,片段管理器仍然附加了之前的片段并被加载。

我能做些什么来摆脱那个碎片?

public class ViewPagerAdapter extends FragmentPagerAdapter {

private String[] mData;

public ViewPagerAdapter(FragmentManager fm) {
    super(fm);
    mData= new String[0];
}

@Override
public Fragment getItem(int position) {
    Bundle bundle = new Bundle();
    bundle.putInt("key", position);

    Fragment fragment = new MyFragment();
    fragment.setArguments(bundle);

    return fragment;
}

@Override
public int getCount() {
    return mData.length;
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

@Override
public CharSequence getPageTitle(int position) {
    return mData[position];
}

public void setData(String[] data) {
    mData= data;
}
}

Activity onCreate()中的一段代码

mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
mViewPagerAdapter.setData(data);
viewPager.setAdapter(mViewPagerAdapter);

【问题讨论】:

  • 为什么需要明确删除片段?您可以只准备数据并刷新内容。
  • 当我没有数据时,我需要删除旧片段。我试图在操作后重新实例化片段以获取更新的数据。否则访问空对象会崩溃。
  • 只需要检查fragment,避免在获取更新数据后崩溃,activity会处理fragment的生命周期,你只需要确保fragment在即将显示时获取到最新的数据(例如在 onCreateView())

标签: android android-fragments android-viewpager fragmentmanager


【解决方案1】:

您可以覆盖instantiateItem() 以像片段一样检测屏幕旋转。

代码示例:

@Override
public boolean isViewFromObject(View view, Object o) {
    return o == view;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
   View view = getActivity().getLayoutInflater().inflate(R.layout.pager_item,
                    container, false);
   return view;
}

注意instantiateItem() 发生在屏幕旋转时。活动没有检测到这一点。提示是该类没有像片段类那样的onCreateView()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多