2012-12-18 13 views
14

Mam pytanie dotyczące DialogFragment. Próbuję utworzyć okno dialogowe, które zachowuje stan po obróceniu urządzenia. To okno dialogowe zawiera wiele odniesień do rzeczy, takich jak adaptery i inne cięższe obiekty, i potrzebuję tego, aby zachować je przy rotacji, jeśli to możliwe, bez konieczności tworzenia wszystkich odnośników Parcelable lub Serializable, aby móc używać OnSaveInstanceState do zapisywania i przywracania ich, gdy oryginalna aktywność jest ponownie tworzona.DialogFragment z setRetainInstanceState (true) nie jest wyświetlany po obróceniu urządzenia

Zauważyłem, że istnieje metoda o nazwie setRetainInstance (boolean) w DialogFragment, która pozwala zachować instancję fragmentu okna, gdy działanie jest ponownie tworzone. Jednak po obróceniu urządzenia okno dialogowe nie jest już wyświetlane. Wiem, że mogę go pobrać z FragmentManager, ale nie mogę znaleźć sposobu, żeby go ponownie zobaczyć. Wszelkie sugestie na ten temat?

Dzięki, Mihai

+1

Być może pomoże to: http://stackoverflow.com/questions/8235080/fragments-dialogfragment-and-screen-rotation –

+0

Widzę tutaj znacznie większy problem koncepcyjny. W dokumentach systemu Android dla setFragmentInstance napisano, że "Kontroluj, czy instancja fragmentu jest zachowywana podczas ponownego tworzenia aktywności (na przykład ze zmiany konfiguracji) .To może być używane tylko z ** fragmentami nie znajdującymi się na tylnym stosie **. set, cykl życia fragmentu będzie nieco inny po odtworzeniu działania ". Czy to dlatego, że fragment okna dialogowego znajduje się w backstacku? – Swapnil

Odpowiedz

21

Istnieje kilka rzeczy, które trzeba zrobić:

  1. stosowanie metody instancji fabryka zainicjować DialogFragment wystąpienie takiego:

    public static MyDialogFragment newInstance(MyModel model) { 
        MyDialogFragment myDialogFragment = new MyDialogFragment(); 
        Bundle bundle = new Bundle(); 
        bundle.putSerializable("MODEL", model); 
        myDialogFragment .setArguments(bundle); 
        return myDialogFragment; 
    } 
    
  2. umieszczając setRetainInstance (true) w onCreate, wszystkie referencje zadeklarowane w fragmencie zostaną zachowane po odtworzeniu pierwotnej aktywności

    @Override 
    public void onCreate(Bundle icicle) { 
        this.setCancelable(true); 
        setRetainInstance(true); 
        super.onCreate(icicle); 
    
    } 
    
  3. unikając zniknąć na obrót robiąc to

    @Override 
    public void onDestroyView() { 
        if (getDialog() != null && getRetainInstance()) 
         getDialog().setDismissMessage(null); 
        super.onDestroyView(); 
    

    }

  4. uzyskać obiekt za pomocą

    (MyModel) getArguments().getSerializable("MODEL") 
    
+0

Dziękuję za odpowiedź @ ricky888, ale ponieważ tworzę instancję fragmentu okna dialogowego i przekazuję rzeczy w konstruktorze fragmentu okna dialogowego, takie jak karty list i inne ciężkie dane, chciałem uniknąć serializacji i myślałem o użyciu zestawu zatrzymań stan instancji, aby fragment dialogowy nie został ponownie utworzony po obróceniu. Tak więc pomyślałem, że używając stanu zachowania stanu zachowania, będę miał ten sam fragment dialogu, co przed rotacją - co oznacza, że ​​fragment fragmentu dialogowego nie został ponownie utworzony wraz z działaniem i jego fragmentami po obrocie. Czy tak jest? – r1k0

+0

setRetainInstance - Określ, czy instancja fragmentu jest zachowywana podczas ponownego tworzenia aktywności (na przykład ze zmiany konfiguracji). Tak więc odpowiedź brzmi "tak". Będziesz zachowywał tę samą instancję wszystkich swoich produktów przez rotację, po prostu umieszczając je w pakiecie, tak jak wspomniałem powyżej. – ricky888

+0

Rzeczywiście poprawna odpowiedź wymagałaby serializacji, więc przeprojektowaliśmy ten fragment tak, by był mniej intensywny dla danych, aby móc utrzymać jego stan po zmianach konfiguracji, jak zasugerował @ ricky888 – r1k0

0

Fragment dialogowe powinny być zachowane automatycznie tak długo, jak wykonać następujące czynności:

  1. Jeśli wezwać onSaveInstanceState aktywność(), upewnić zadzwonić Funkcja super !!!!. W moim przypadku to był klucz. Upewnij się również, że robisz to samo w Fragmentie. Jeśli używasz setRetainInstance, musisz ręcznie zapisać wartości. W przeciwnym razie, w większości przypadków powinieneś być w stanie się nią nie przejmować. Jeśli robisz coś nieco bardziej skomplikowanego, możesz potrzebować setRetainInstance(true), ale w przeciwnym razie zignoruj ​​to.
  2. Niektóre osoby skarżyły się na błąd w bibliotece pomocy technicznej, w którym wiadomość o odrzuceniu jest wysyłana, gdy nie powinna być. Wydaje się, że najnowsza biblioteka pomocy naprawiła to, więc nie powinieneś się o to martwić.
+2

O # 2, myślę, że chodziło Ci o " jeśli nie użyjesz setRetainInstance ... "na początku zdania, ponieważ w przeciwnym razie będziesz musiał przechowywać i przywracać wartości. –

Powiązane problemy