4

次の問題があります。私はそれのために持っViewPagerFragmentPagerAdapterいます。

私がする必要があるのは、このページが選択されたときにある私のからいくつかのメソッドを呼び出すことFragmentですViewPager

すべてのフラグメントをListアダプター内に保持しようとしましたが、問題は、デバイスを回転させるときにアダプターが以前のフラグメントを使用することです。ローテーション後に新しいフラグメントが作成され、それらのリストがありますが、以前のフラグメントにアクセスする方法がわかりません。新しいフラグメントのみへの参照があります。

これが私のアダプターです:

public class MainPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragmentList;

    public MainPagerAdapter(FragmentManager fm) {
        super(fm);
        fragmentList = new ArrayList<Fragment>();
        fragmentList.add(new TaskPageFragment());
        fragmentList.add(new HistoryFragment());
        fragmentList.add(new TestFragment());
    }

    @Override
    public Fragment getItem(int i) {
        return fragmentList.get(i);
    }

    @Override
    public int getCount() {
        return 3;
    }
}

もちろん、オブジェクトのようにのみ作成されたフラグメントにアクセスしようとすると、アクティビティコンテキストにアクセスできません。

Fragment fragment = pagerAdapter.getItem(i);
if (fragment instanceof SelectionListener) {
     ((SelectionListener)fragment).onTabSelected();
}

これがonTabSelected()メソッド呼び出しです。これは、各フラグメントに実装したインターフェイスでありViewPager、画面の回転後に呼び出されるとnullになりますContext

4

1 に答える 1

0

デバイス構成は、実行時に変更される可能性があります(画面の向きなど)。これが発生すると、アクティビティが再開されます。これは、アクティビティが新しいデバイス構成に一致するように調整できるようにするために行われます。フラグメントはアクティビティ内にあるため、「破棄」されます。

ただし、あなたの質問から私が理解していることから、UI構成の変更を探しておらず、API 11以降を使用していると想定しているため、問題は簡単な方法で解決できる可能性があります。

public void setRetainInstance(ブール値保持)

以来:APIレベル11

フラグメントインスタンスがアクティビティの再作成(構成の変更など)全体で保持されるかどうかを制御します。これは、バックスタックにないフラグメントでのみ使用できます。設定されている場合、アクティビティが再作成されるときのフラグメントのライフサイクルはわずかに異なります。

  • onDestroy()は呼び出されません(ただし、フラグメントが現在のアクティビティから切り離されているため、onDetach()は呼び出されます)。
  • フラグメントが再作成されていないため、onCreate(Bundle)は呼び出されません。
  • onAttach(Activity)およびonActivityCreated(Bundle)は引き続き呼び出されます。
public MainPagerAdapter(FragmentManager fm) {
    Fragment frag = null;
    super(fm);
    fragmentList = new ArrayList<Fragment>();
    frag = new TaskPageFragment();
    frag.setRetainInstance(true);
    fragmentList.add(frag);

    frag = new HistoryFragment();
    frag.setRetainInstance(true);
    fragmentList.add(frag);

    frag = new TestFragment();
    frag.setRetainInstance(true);
    fragmentList.add(frag);
}
于 2012-06-28T18:38:22.037 に答える