2012-09-08 6 views
11

Mam niestandardowy widok, który rozszerza LinearLayout. Zaimplementowałem metody onSaveInstanceState() i onRestoreInstanceState(), aby zapisać bieżący stan widoku. Jednak żadne działanie nie jest podejmowane. Kiedy umieszczam dziennik wewnątrz tych dwóch metod, również nic nie pojawia się w Log Cat. Zakładam, że te dwie metody nie są nawet wywoływane. Czy ktoś może wyjaśnić, gdzie jest problem? Dzięki.onSaveInstanceState() i onRestoreInstanceState (stan paczek) nie są wywoływane?

@Override 
public Parcelable onSaveInstanceState() { 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("instanceState", super.onSaveInstanceState()); 
    bundle.putInt("currentPage", currentPage); 
    return bundle; 
} 

@Override 
public void onRestoreInstanceState(Parcelable state) { 

    if (state instanceof Bundle) { 
     Bundle bundle = (Bundle) state; 
     currentPage = bundle.getInt("currentPage"); 
     Log.d("State", currentPage + ""); 
     super.onRestoreInstanceState(bundle.getParcelable("instanceState")); 
     return; 
    } 
     super.onRestoreInstanceState(state); 
    } 

Odpowiedz

4

Po kopaniu w systemie Android OS w końcu udało mi się to ustalić. Jak podejrzewałem: nie ma nic złego w tych dwóch metodach. Oni nie są po prostu wezwani. W Internecie można przeczytać, że "onRestoreInsatnceState jest wywoływane, gdy aktywność jest ponownie tworzona" Ok, robi wrażenie, ale nie jest to całkowicie prawda. Tak, funkcja onRestoreInstanceState() jest wywoływana, gdy aktywność jest odtwarzana, ale tylko iff:

został zabity przez OS. „Taka sytuacja zdarzyć, gdy:

  • orientacja elementu zmienia się (swoją aktywność zostaje zniszczony i odtworzony)
  • istnieje inna aktywność przed Ciebie i w pewnym momencie OS zabija swoją działalność w celu zwolnienia pamięci (na przykład) Następnym razem, gdy uruchomisz swoją działalność naRestoreInstanceState() zostanie wywołana. "

Więc jeśli jesteś w swojej działalności i hit przycisk Powrót na urządzeniu, twoja aktywność jest wykończenie() ed i następnym uruchomieniu aplikacji zostanie uruchomiony ponownie (to brzmi jak ponownie utworzone, nie jest?), ale tym razem bez zapisanego stanu, ponieważ celowo opuściłeś go po naciśnięciu przycisku Wstecz.

+6

miałem dokładnie ten sam problem, ale to dlatego, że mój zwyczaj 'View' nie miał' id' zestawu. Z dokumentów _ "Zauważ, że nawet jeśli włączone jest zamrażanie, widok nadal musi mieć przypisany identyfikator (przez setId (int)), aby jego stan został zapisany." _ –

3

Jak wspomniano w komentarzu Stevena Byle, niestandardowy View musi mieć przypisany identyfikator, aby można go było wywołać onSaveInstanceState. I dokonał tego poprzez ustawienie identyfikatora w moim zwyczaju View konstruktora:

public class BoxDrawingView extends View { 
    private int BOX_DRAWING_ID = 555; 
    … 

    public BoxDrawingView(Context context, AttributeSet attrs) { 
     … 
     this.setId(BOX_DRAWING_ID); 
    } 
    … 

} 
+0

Jest to niebezpieczne. W przypadku dodania wielu "BoxDrawingView" w tym samym układzie, wszystkie zostaną przywrócone w tym samym stanie, co ostatnio dodane! – Antimonit

+0

Od poziomu API istnieje rozwiązanie tego problemu: użyj View.generateViewId() zobacz: https://developer.android.com/reference/android/view/View.html#generateViewId() – bw15

Powiązane problemy