2013-01-04 13 views
5

私はViewPagerに4つのタブを持っています。ViewPagerでタブを変更したときにフラグメントが再作成される

FragmentPagerAdapterを拡張するカスタムアダプタを使用しています。

問題は、タブを変更すると、最初にFragmentが作成されますが、現在表示されていません。 さらに、これは4回目のタブの変更後にのみ発生します。例えば。 tab1→tab2→tab3 =>onStopが呼び出されます。 - > tab2 => tab1のonCreateViewが呼び出されます(onAttachは呼び出されません)。

私はこれを避けたいと思います。私はすべてのタブが現在表示されていなくても常にその状態を維持する必要があります。 どうすればいいですか?

答えて

20

setOffscreenPageLimit()からViewPagerまでは簡単です。

詳細情報:それは一つでも表示されない場合、それは立ち止まった後に再び作成されたのはなぜhttp://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

+0

ありがとう、私は最終的に私のコードを作った!保存されたインスタンスを取得しようとしていましたが、この1 LOCでxDを動作させました –

+0

シンプルでありがとうございました! – neobie

+0

ありがとうございます。それは私の問題を解決しました –

0

フラグメントをインスタンス化するときは、setRetainInstance(true)を呼び出します。これにより、フラグメントのインスタンス状態が保持されます。 onCreateViewが呼び出されます。保存された状態を再利用し、ビューをレンダリングする際に、再度データをロードしないでください。 booleanを使用して、フラグメントがすでに初期化されているかどうかを表します。あなたはonSaveInstanceState()を実装する必要はありません

public static class MyAdapter extends FragmentPagerAdapter { 
     @Override 
     public Fragment getItem(int position) { 
       MyFragment myFragment = new MyFragment(); 
       myFragment.setRetainInstance(true); 
       return myFragment; 
     } 
} 

class MyFragment extends Fragment { 
     . 
     . 
     . 

     boolean initialized = false; 
     ArrayList<MyData> myData = null; 

     void onCreate(...) { 
       if (initialized) { 
         renderViews(); 
       } else { 
         initialized = true; 
         loadData(); 
         renderViews(); 
       } 
     } 
} 

あなたはこのような何かをするだろう。自動的に処理されます。

+0

は私が..この動作を理解していませんか? しかし、あなたのアプローチに従っていますが、私は状態を保存する方法を理解できません。 'Fragment'から' onCreateView() 'に' setRetainInstance(true) 'を追加しましたが、' onSaveInstanceState() 'は決して呼び出されません。 – sergi

+0

スライディングアニメーションで表示できるように、現在のビューの左右にフラグメントを作成するので再度呼び出されます。詳細は私の編集を参照してください。 –

+0

これはもっとはっきりしていますが、 'onCreate()'ではなく 'onCreateView()'でビューを返す必要があり、前の状態に合わせて変更する必要がある 'View'を返す必要があります。 実際、 'myFragment.setRetainInstance(true);を使用すると、' onCreateView() 'や' onCreate() 'は以前にあったときは呼び出されません。 – sergi

関連する問題