web-dev-qa-db-ja.com

Android画面回転でカスタムArrayListを保存する方法?

画面の回転で保存および復元できるようにしたいカスタムオブジェクトのArrayListがあります。

onSaveInstanceStateまたはonRestoreInstanceStateを実装するArrayListを独自のクラスにする場合、これはParcelableおよびSerializableで実行できることを知っています。 。しかし、別のクラスを作成せずにこれを行う方法はありますか?

50
Kalina

カスタムオブジェクトのArrayListを渡すために新しいクラスを作成する必要はありません。オブジェクトにParcelableクラスを実装し、onSaveInstanceState()およびonRestoreInstanceState()Bundle#putParcelableArrayList() を使用するだけです。このメソッドは、ParcelablesのArrayListを単独で保存します。


Parcelables(およびSerializablesとBundles)の件名が頭を痛めることがあるため、ここにバンドルに保存されたカスタムParcelableオブジェクトを含むArrayListの基本的な例を示します。 (これは実行可能ファイルの切り取りと貼り付けであり、レイアウトは不要です。)

小包の実装

public class MyObject implements Parcelable {
    String color;
    String number;

    public MyObject(String number, String color) {
        this.color = color;
        this.number = number;
    }

    private MyObject(Parcel in) {
        color = in.readString();
        number = in.readString();
    }

    public int describeContents() {
        return 0;
    }

    @Override
    public String toString() {
        return number + ": " + color;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(color);
        out.writeString(number);
    }

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

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

状態の保存/復元

public class Example extends ListActivity {
    ArrayList<MyObject> list;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState == null || !savedInstanceState.containsKey("key")) {
            String[] colors = {"black", "red", "orange", "cyan", "green", "yellow", "blue", "purple", "Magenta", "white"};
            String[] numbers = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};

            list = new ArrayList<MyObject>();
            for(int i = 0; i < numbers.length; i++) 
                list.add(new MyObject(numbers[i], colors[i]));
        }
        else {
            list = savedInstanceState.getParcelableArrayList("key");
        }

        setListAdapter(new ArrayAdapter<MyObject>(this, Android.R.layout.simple_list_item_1, list));
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putParcelableArrayList("key", list);
        super.onSaveInstanceState(outState);
    }
}
84
Sam

onRetainNonConfigurationInstance()を使用できます。構成を変更する前にオブジェクトを保存し、getLastNonConfigurationInstanceState()で復元できます。

アクティビティ内:

_    @Override
    public Object onRetainNonConfigurationInstance() {
        return myArrayList;
    }
_

内部onCreate()

_    try{
        ArrayList myArrayList = (ArrayList)getLastNonConfigurationInstance();
    } catch(NullPointerException e) {}
_

ランタイム変更の処理: http://developer.Android.com/guide/topics/resources/runtime-changes.html ドキュメント: http://developer.Android.com/reference/ Android/app/Activity.html#onRetainNonConfigurationInstance%28%29

3
Techwolf
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    ArrayList<Integer> id=new ArrayList<>();
    ArrayList<String> title=new ArrayList<>();
    for(int i=0;i<arr.size();i++){
        id.add(arr.get(i).id);
        title.add(arr.get(i).title);
    }
    outState.putIntegerArrayList("id",id);
    outState.putStringArrayList("title",title);
}
1