Thông thường khi giao diện người dùng không giữ trạng thái của nó, điều đầu tiên cần kiểm tra là giao diện người dùng này có id được chỉ định. Nếu không có chế độ xem id này không thể khôi phục trạng thái của chúng.
<EditText android:id="@+id/text" ... />
Nếu điều này không giúp đỡ, bạn cần phải lưu và khôi phục trạng thái bản thân. Hãy xem Handling Runtime Changes. Nó khá nhiều giải thích những gì bạn nên làm:
Để xử lý đúng đắn khởi động lại, điều quan trọng là hoạt động của bạn phục hồi trạng thái trước đó thông qua vòng đời Hoạt động bình thường, trong đó Android gọi onSaveInstanceState()
trước khi nó phá hủy hoạt động của bạn để bạn có có thể lưu dữ liệu về trạng thái ứng dụng. Sau đó, bạn có thể khôi phục trạng thái trong thời gian onCreate()
hoặc onRestoreInstanceState()
. Để kiểm tra xem ứng dụng của bạn có tự khởi động lại với trạng thái ứng dụng không, bạn nên gọi các thay đổi cấu hình (chẳng hạn như thay đổi hướng màn hình) trong khi thực hiện các tác vụ khác nhau trong ứng dụng của bạn.
Bạn nên ghi đè onSaveInstanceState()
và lưu trạng thái Acitivity của bạn khi gọi của nó:
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putString("textKey", mEditText.getText().toString());
}
Và sau đó khôi phục trạng thái trong onCreate()
hoặc onRestoreInstanceState()
:
public void onCreate(Bundle savedInstanceState)
{
if(savedInstanceState != null)
{
mEditText.setText(savedInstanceState.getString("textKey"));
}
}
Nếu điều này vẫn không phải là đủ, bạn có thể ghi đè onRetainNonConfigurationInstance()
và trả lại bất kỳ đối tượng tùy chỉnh nào sẽ là pa ssed đến đối tượng hoạt động mới, khi nó được tái tạo. Thông tin chi tiết về cách sử dụng nó có thể được tìm thấy trong Handling Runtime Changes. Nhưng chức năng này không được chấp nhận trong Android 3.0+ (đặc biệt cho FragmentActivity
nơi kết thúc của nó). Vì vậy, điều này không thể được sử dụng cùng với Fragments (đó là tốt, họ có cơ chế của họ để giữ lại các đối tượng vượt qua những thay đổi cấu hình).
Và điều cuối cùng - không bao giờ sử dụng android:configChanges
. Bạn phải có lý do rất tốt để sử dụng nó, và thường đây là những lý do hiệu suất. Nó không có nghĩa là bị lạm dụng theo cách của nó bây giờ: chỉ để ngăn chặn trạng thái UI reset. Nếu thuộc tính này được sử dụng, thì có, Giao diện người dùng hoạt động sẽ không được đặt lại trên thay đổi cấu hình, nhưng trạng thái Hoạt động vẫn sẽ được đặt lại khi bị hủy và tạo lại sau.
Các tài liệu giải thích tùy chọn này khá tốt:
Lưu ý: Xử lý các cấu hình thay đổi chính mình có thể làm cho nó nhiều hơn nữa khó sử dụng nguồn tài nguyên thay thế, bởi vì hệ thống không tự động áp dụng chúng cho bạn. Kỹ thuật này cần được xem xét một phương sách cuối cùng và không được khuyến khích đối với hầu hết các ứng dụng
Được rồi sao cho âm thanh như một cách tiếp cận tốt hơn nhiều. Tôi có thể sử dụng điều này cho bitmap thay vào đó, và sau đó edittext sẽ không phải là một vấn đề - Nhưng tôi sẽ sử dụng chức năng nào để lưu trạng thái của hình ảnh? – Sebastian
Nếu bitmap được lưu trên đĩa, thì chỉ cần lưu đường dẫn tới bitmap trong hàm 'onSaveInstanceState()'. Nếu bitmap nằm trong bộ nhớ, thì bạn có thể sử dụng 'onRetainNonConfigurationInstance()'. – inazaruk