2

我有一个Activity,它有ViewPager。这ViewPager使用. Fragments_ Adapter我的每个片段都被视为部分(根据应用功能)。最初我使用一次加载所有ViewPager项目,

viewPager.setOffscreenPageLimit(sectionList.size()); //sectionList is nothing but number of framgents

在片段中,我有一个在创建片段时setupAdapter类调用的函数。

调查片段

public void setup(SectionView sectionView, int pos) {
    this.sectionView = sectionView;
    this.pos = pos;
}

调查适配器

@Override
public Fragment getItem(int pos) {
    InvestigationFragment investigationFragment = new InvestigationFragment();
    investigationFragment.setup(sectionViewHashMap.get(keys.get(pos)), pos);
    fragments.add(investigationFragment);
    return investigationFragment;
}

这里SectionView是一个由 class 扩展的抽象类SimpleSection。并在其中SimpleSection添加自定义视图。自定义视图大约有 20-30 个视图类。

public abstract class SectionView {

    public Section mSection;
    public Context mContext;
    public LinkedHashMap<Integer, SectionView> subSectionViews;
    public LinkedHashMap<Integer, FieldWidget> fieldWidget;
    public int actionSaveId;
    protected LinearLayout sectionView;
    protected Toolbar toolbar;

    public final void initialiseSection(Toolbar toolbar) {
        this.toolbar = toolbar;
        createFields();
        createSubSection();
    }

    public final void buildSection(LinearLayout v) {
        sectionView = v;
        addFields();
        addSubSection();
    }

    protected abstract void createFields();
    protected abstract void createSubSection();
    protected abstract void addFields();
    protected abstract void addSubSection();
    public abstract boolean hasSubSection();
    public abstract boolean validateSection();
    protected abstract boolean persistSection();

    public final boolean saveSection() {
        boolean isSaved = true;
            if (!validateSection()) {
                isSaved = false;
            } else if (!persistSection()) {
                isSaved = false;
            }
        return isSaved;
    }
}

到这里为止一切都很好。但是在某些我无法保留它的情况下,SectionView 会变为空。这是场景,

  1. 我有自定义相机实现,从片段我打开我的自定义相机(不破坏片段或活动),捕获图像,然后我回到片段onCreateView()有时被调用,所以sectionView是空的。当我调试时,没有调用任何生命周期方法(例如onDestroyView(), onDestroy(), onDetach(), onLowMemeory(), onConfigurationChanged())。那怎么onCreateView()叫呢?

  2. 在 Nexus 9 中,在更改运行时权限时发生了同样的情况。我将进入Fragment,向下滚动状态栏 > 转到设置 > 应用程序 > 应用程序权限 > 位置 > 撤销位置权限。如果我授予权限,它不会崩溃,但如果我撤销 sectionView 对象将为空

奇怪的行为:为了检查第二种情况,我连接了调试器以确保在撤销Location权限时片段/活动是否被破坏。一旦我撤销了位置权限,调试器就会断开连接并且应用程序被杀死/死亡。每当我撤销任何权限时都会发生这种情况。

现在如何确保sectionView对象被保留或不被销毁?

4

1 回答 1

0

一些东西。您可以将屏幕外页面限制设置为 size() -1,因为其中一个始终在屏幕上。

我建议不要在您的片段上使用设置方法,而是使用您想要的值来实例化您的片段。因此,在 InvestigationFragment 中创建一个名为 newInstance 的静态方法,该方法采用 SectionView 和 position 参数。

例如

public static InvestigationFragment newInstance(SectionView sectionView, int pos) {
    final InvestigationFragment fragment = new InvestigationFragment();
    final Bundle args = new Bundle();
    args.putSerializable("SectionView", sectionView); //Depends on what type this as to what the put method is
    args.putInt("Position", position);
    fragment.setArguments(args);
    return fragment;
}

然后,您应该在 InvestigationFragment 的 onCreate 中读回这些值,例如

sectionView = (SectionView) getArguments().getSerializable("SectionView");

这应该允许您的 InvestigationFragment 正确地在旋转变化等情况下存活。

在您的 Adapter 课程中,我建议您这样做:

@Override
    public Fragment getItem(final int position) {
      return InvestigationFragment.newInstance(sectionViewHashMap.get(keys.get(position)), position);
}

如果你真的需要在你的寻呼机适配器中维护一个片段列表,你应该重写 instantiateItem 和 destroyItem 如下:

@Override
public Object instantiateItem(final ViewGroup container, final int position) {
    final InvestigationFragment fragment = (InvestigationFragment) super.instantiateItem(container, position);
    fragments.put(position, fragment);
    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    fragments.remove(position);
    super.destroyItem(container, position, object);
}
于 2016-02-26T17:31:27.177 回答