6

Tôi có một hoạt động nhỏ với EditText và một lần xem hình ảnh và nút. Khi bạn nhấn nút, nó sẽ khởi chạy máy ảnh cho kết quả, và khi nó trả về, nó sẽ thay đổi số lần xem ảnh thành bức ảnh bạn vừa chụp.Lượt xem của tôi đang được đặt lại về thay đổi hướng

Nhưng khi định hướng thay đổi, số lần xem lại sẽ đặt lại về mặc định trên bố cục.

Điều tôi đã cố gắng thực hiện là đặt một tùy chọn được gọi là boolean, và khi bạn chụp ảnh, nó đặt nó thành true. Tôi overrid onConfigurationChanged() và nếu tùy chỉnh được đặt thành true, tôi sẽ khôi phục lại hình ảnh.

Vấn đề của tôi bây giờ là EditText bị xóa - Làm cách nào tôi có thể khôi phục EditText sau khi thay đổi cấu hình? Nỗ lực đầu tiên của tôi là lưu trữ nội dung của nó vào một String onPause() và sau đó khôi phục nó, nhưng nó luôn luôn trống.

Trả lời

14

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

+0

Đượ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

+0

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

4

Bạn có thể buộc hoạt động của mình không tải lại sau khi thay đổi hướng bằng cách thêm android:configChanges="orientation" vào dòng hoạt động của bạn trong tệp kê khai.

+0

Nhưng sẽ không làm cho hoạt động này không điều chỉnh để điện thoại bị nghiêng? – Sebastian

+0

Đây là câu trả lời đúng. Một trong những ngăn cản màn hình để thay đổi định hướng là 'android: screenOrientation =" portrait "' –

+4

Trong khi điều này sửa chữa trường hợp cụ thể này, nó không khắc phục vấn đề cơ bản. Và 'android: configChanges' được coi là phương sách cuối cùng và thường không bao giờ được sử dụng. http://developer.android.com/guide/topics/resources/runtime-changes.html – inazaruk

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