2015-05-30 17 views
20

Wiem, że istnieje wiele zapytań regarden onSaveInstanceState, ale nie byłem w stanie znaleźć odpowiedzi na mój problem.Funkcja onSaveInstanceState nie jest wywoływana po obróceniu ekranu

Mam działalność, która rozszerza AppCompatActivity; to działanie wykorzystuje 3 fragmenty i ma zmienną "int currentStep" do śledzenia, który fragment jest wyświetlany. W metodzie onSavedInstanceState przechowuję zmienną currentStep w pakiecie, a następnie metodę onCreate, którą przywracam.

public class MainActivity extends AppCompatActivity { 
    private final String CURRENT_STEP_TAG = "current_step"; 
    private int currentStep; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pedido);   

     if(savedInstanceState == null) { 
      loadFirstFragment(); 
     } else {    
      currentStep = savedInstanceState.getInt(CURRENT_STEP_TAG); 
      if(currentStep == 2){ 
       //Do some stuff... 
      } 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
     Log.d("deubg", "--------onsaveinstancestate--------"); 
     outState.putInt(CURRENT_STEP_TAG, currentStep); 
     super.onSaveInstanceState(outState, outPersistentState); 
    } 

... 

} 

Chodzi o to, że onSavedInstanceState nie zostanie wywołana, gdy zmiany orentation ekranem oraz zgodnie z dokumentacją google, powinno. Komunikat "-------- onsaveinstancestate --------" nie pojawia się w konsoli. Jednak pakiet savedInstanceState w metodzie onCreate nie jest pusty po obróceniu ekranu, ale nie ma int 'currentStep'.

Próbowałem już wielu rzeczy: zmieniłem AppCompatActivity dla ActionBarActivity, przeniosłem wywołanie super.onSavedInstanceState do różnych lokalizacji, próbowałem przechowywać inne zmienne; ale bez względu na to, co robię, metoda nie jest wykonywana.

Również nie mam Androida: configChanges w moim manifeście.

Moja aplikacja jest skompilowany z sdk wersji 22, buildToolsVersion 22.0.1

Odpowiedz

49

Chyba że aplikacja jest uruchomionana Lollipop (API21) wersji Androida lub nowszy, twój

public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState); 

będzie NOT można się nazywać, ponieważ nie istnieje po wcześniejszych wersjach platformy niż 21. Aby obsługiwać urządzenia z interfejsem pre API 21, należy zamiast powyższego zastąpić następującą metodę:

public void onSaveInstanceState (Bundle outState); 

Będzie to działać również na API 21+, więc nie musisz oczywiście przesłonić obu metod (chyba, że ​​wiesz, że musisz radzić sobie z PersistableBundle, którą oferuje nowy).

See docs.

+0

Dzięki! Nie zdawałem sobie sprawy, że istnieje nowsza wersja Mehtoda. Teraz działa dobrze. – VorteXavier

+0

Kolejne pytanie, to onSaveInstanceState (Bundle outState); uzyskać wywołanie na urządzeniu z Androidem API21 +? lub czy muszę zastąpić obie metody? – VorteXavier

+0

Tak, zostanie wywołana. Nie trzeba przesłonić obu –

Powiązane problemy