0

いくつかのフラグメントを含むビューページャーがあり、フラグメントの UI を編集する必要があることに応じて、各フラグメントにモデル クラスを設定します。FragmentStatePagerAdapter にそのフラグメントを追加する前に、そのモデル クラスをコンストラクターでフラグメント化するように設定しました。私の問題は、画面を回転させた後、またはシステムがアプリケーションを強制終了して復元すると、システムによってフラグメントが再作成され、モデル クラスのインスタンスが失われることです。新しい FragmentStatePagerAdapter を設定しても、システムによって作成されたフラグメントが表示されます。フラグメントの新しいインスタンスを作成してビューページャーに配置する正しい方法はありますか? FragmentManagerからフラグメントを削除する、Adapterをviewpagerに再度追加する、FragmentStatePagerAdapterをFragmentPagerAdapterのみに変更するなど、多くのことを試してみましたが、何も役に立ちませんでした。

いくつかのリソースからローダーにモデルクラスをロードするアクティビティクラス:

        List<Fragment> visibleFragment = new ArrayList<Fragment>();
        for (Screen screen : wizard.screens) {
            if (screen.visible) {
                visibleFragment.add(new ScreenUI(screen));
            }
        }
        viewPager.setAdapter(null);
        viewPager.setAdapter(new WizardPagerAdapter(getSupportFragmentManager(), visibleFragment));

マイ FragmentStatePagerAdapter

public class WizardPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments;
private final int count;

public WizardPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    mFragments = fragments;
    count = mFragments.size();
}

@Override
public Fragment getItem(int index) {
    return mFragments.get(index);
}

@Override
public int getCount() {
    return count;
}
}
4

2 に答える 2

1

アクティビティに Manifest android:configChanges="orientation|keyboardHidden|screenSize" を追加してみてください。

またはそのようなもの

public class ViewPagerTaskAdapter extends FragmentStatePagerAdapter {
Map<Integer, FragmentViewTask> fragmentsTask = new HashMap<Integer, FragmentViewTask>();
@Override
    public Fragment getItem(int arg0) {
        FragmentViewTask myFragment = FragmentViewTask.newInstance(arg0,
                tasks.get(arg0));
        fragmentsTask.put(arg0, myFragment);
        return myFragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        fragmentsTask.remove(position);
    }
        public FragmentViewTask getFragment(int key) {
        return fragmentsTask.get(key);
    }

    @Override
    public int getCount() {
        if (tasks != null)
            return tasks.size();

        return 0;
    }

}
于 2013-09-04T08:23:26.837 に答える
0

で使ってみonRetainInstance(true)ましたFragmentsか?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);    
}
于 2013-09-04T14:17:42.010 に答える