2010-07-03 32 views

Trả lời

51

Đối tượng tùy chỉnh có thể được lưu bên trong Nhóm khi chúng triển khai giao diện Parcelable. Sau đó, họ có thể được lưu thông qua:

@Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putParcelable("key", myObject); 
    } 

Về cơ bản các phương pháp sau đây phải được thực hiện trong tập tin lớp:

public class MyParcelable implements Parcelable { 
    private int mData; 

    public int describeContents() { 
     return 0; 
    } 

    /** save object in parcel */ 
    public void writeToParcel(Parcel out, int flags) { 
     out.writeInt(mData); 
    } 

    public static final Parcelable.Creator<MyParcelable> CREATOR 
      = new Parcelable.Creator<MyParcelable>() { 
     public MyParcelable createFromParcel(Parcel in) { 
      return new MyParcelable(in); 
     } 

     public MyParcelable[] newArray(int size) { 
      return new MyParcelable[size]; 
     } 
    }; 

    /** recreate object from parcel */ 
    private MyParcelable(Parcel in) { 
     mData = in.readInt(); 
    } 
} 
+3

Tôi thấy ít công việc dịch sang và quay trở lại từ JSON, so với bưu kiện – Arcantos

+0

onSaveInstanceState phải ở cuối chức năng! https://developer.android.com/training/basics/activity-lifecycle/recreating.html –

+0

Mặc dù đây là cách phù hợp để lưu đối tượng tùy chỉnh trong onSaveInstanceState(), bạn phải đảm bảo rằng bạn không lưu các đối tượng lớn bằng cách sử dụng phương thức này . Đây chỉ là để lưu trạng thái của màn hình. Nếu các đối tượng trở nên lớn, có khả năng bạn nhận được ngoại lệ 'TransactionTooLargeException' – abat

1

Kiểm tra câu trả lời this.

Về cơ bản, bạn phải lưu nó bên trong một Bundle.

+0

Ok cảm ơn, có thể tôi chưa đủ rõ ràng. Những gì tôi muốn biết là làm thế nào để lưu một đối tượng * tùy chỉnh *. Tôi thấy rằng tôi có thể làm cho nó có thể được chuyển nhượng. – jul

3

Tôi biết "rằng trường hợp này là lạnh", nhưng vì tôi tìm thấy chủ đề này đầu tiên, khi tôi đang tìm kiếm chính xác điều tương tự (và tìm thấy câu trả lời ngay bây giờ):

Hãy tưởng tượng Bundle là một tệp XML. Nếu bạn tạo một <BUNDLE name="InstanceName" type="ClassName"> mới, bạn có thể tự do thêm các phần tử và thuộc tính vào một không gian tên mới và trống.

Khi onSaveInstance(Bundle outState) của MainActivity bạn được gọi là (bạn cũng có thể buộc này trong), bạn có thể tạo mới: Bundle b = new Bundle();

Sau đó gọi của bạn (có thể là không được thừa kế và không overriden) tùy chỉnh Phương pháp onSaveInstance(Bundle b) trong lớp học của riêng bạn với Gói mới được tạo b. Sau đó (trong onSaveInstance(Bundle outState)) của MainActivity, hãy gọi outState.putBundle("StringClassAndInstanceName", b);

Khi bạn tìm thấy chuỗi này trong onCreate, bạn có thể sử dụng một công tắc/trường hợp để tái tạo đối tượng này hoặc (tốt hơn) có một chức năng nhà máy ở lớp tùy chỉnh của bạn để làm việc với Gói và "StringClassAndInstanceName".

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