2015-05-30 19 views
20

Tôi biết có rất nhiều quetions regarden onSaveInstanceState nhưng tôi không thể tìm thấy câu trả lời cho vấn đề của mình.onSaveInstanceState không nhận được cuộc gọi sau khi xoay màn hình

Tôi có một hoạt động mở rộng AppCompatActivity; hoạt động này sử dụng 3 đoạn và nó có một biến 'int currentStep' để theo dõi phân đoạn nào đang được hiển thị. Trong phương thức onSavedInstanceState, tôi lưu biến currentStep trong gói, và sau đó trong phương thức onCreate, tôi khôi phục nó.

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

... 

} 

Điều này là onSavedInstanceState sẽ không nhận được khi được thay đổi màn hình hoặc theo tài liệu của google. Thông báo "-------- onsaveinstancestate --------" không hiển thị trong bảng điều khiển. Tuy nhiên Bundle savedInstanceState trong phương thức onCreate không phải là null sau khi xoay màn hình, nhưng nó không có int 'currentStep'.

Tôi đã thử nhiều thứ: thay đổi AppCompatActivity cho ActionBarActivity, đã chuyển cuộc gọi cho super.onSavedInstanceState đến các vị trí khác nhau, đã cố lưu các biến khác; nhưng không có vấn đề gì tôi làm phương pháp không thực hiện.

Ngoài ra, tôi KHÔNG có android: configChanges trong tệp kê khai của mình.

ứng dụng của tôi đang được biên dịch chống lại sdk phiên bản 22, buildToolsVersion 22.0.1

Trả lời

49

Trừ khi ứng dụng của bạn là chạy trên Lollipop (API21) phiên bản của Android hoặc mới hơn,

public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState); 

của bạn sẽ KHÔNG được gọi là vì nó đơn giản không tồn tại trên các phiên bản trước của nền tảng hơn 21. Để hỗ trợ các thiết bị API 21 trước, bạn phải thay thế phương thức sau:

public void onSaveInstanceState (Bundle outState); 

Điều này cũng hoạt động trên API 21+, vì vậy bạn không cần ghi đè cả hai phương pháp, tất nhiên (trừ khi bạn biết mình cần xử lý PersistableBundle tùy chọn mới cung cấp).

See docs.

+0

Cảm ơn! Tôi đã không nhận ra rằng có một phiên bản mới hơn của mehtod. Nó hoạt động tốt ngay bây giờ. – VorteXavier

+0

Một câu hỏi khác, sẽ onSaveInstanceState (Bundle outState); được gọi trong thiết bị chạy API21 + android? hoặc tôi có cần ghi đè cả hai phương pháp không? – VorteXavier

+0

Có, nó sẽ được gọi. Không cần phải ghi đè cả hai số –

Các vấn đề liên quan