2013-01-04 11 views
5

Mam ViewPager z 4 zakładkami.Fragment ponownie utworzony, gdy zakładka zmiany z ViewPager

Używam niestandardowej karty rozszerzającej FragmentPagerAdapter.

Problem polega na tym, że po zmianie karty pierwszy Fragment zostaje ponownie utworzony, chociaż nie jest aktualnie widoczny. Co więcej, dzieje się tak tylko po zmianie karty po raz czwarty. Na przykład. Zakładka tab1 -> tab2 -> tab3 =>onStop z zakładki tab1. -> tab2 =>onCreateView z tab1 jest wywoływane (onAttach nie jest wywoływane).

Chcę tego uniknąć. Potrzebuję, aby wszystkie zakładki pozostały zawsze w swoim stanie, nawet jeśli nie są aktualnie wyświetlane. Jak mogę to zrobić?

Odpowiedz

0

Gdy tworzysz instancję fragmentu, zadzwoń pod numer setRetainInstance(true). Zachowa to stan instancji fragmentu. onCreateView będzie nadal wywoływana, a będziesz musiał upewnić się, że ponownie użyjesz zapisanego stanu i po prostu wyrenderujesz widoki bez ponownego wczytywania danych, np. za pomocą boolean do reprezentacji, jeśli Twój fragment został już zainicjowany.

Można by zrobić coś takiego:

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(); 
       } 
     } 
} 

Nie potrzeba wdrożenia onSaveInstanceState(). Będzie on obsługiwany automatycznie.

+0

Nie rozumiem tego zachowania .. Dlaczego jest tworzony ponownie po zatykać, jeśli nie jest to nawet jeden wyświetlane? Mimo to staram się podążać za twoim podejściem, ale nie mogę wymyślić, jak uratować państwo. Dodałem 'setRetainInstance (true)' w 'onCreateView()' z 'Fragment', ale' onSaveInstanceState() 'nigdy nie jest wywoływane. – sergi

+0

Wywoływany jest ponownie, ponieważ tworzy fragment po lewej i prawej stronie bieżącego widoku, dzięki czemu może wyświetlać go z przesuwaną animacją. Zobacz moją edycję po więcej szczegółów. –

+0

jest teraz bardziej przejrzysty, ale nie robię nic z widokami w 'onCreate()', ale w 'onCreateView()', który musi zwrócić 'Widok', który będzie musiał zostać zmodyfikowany, aby pasował do poprzedniego stanu. W rzeczywistości, kiedy używam 'myFragment.setRetainInstance (true);' 'onCreateView()' lub 'onCreate()' nie jest wywoływany, gdy poprzednio był. – sergi

Powiązane problemy