izuki
9/11/2017 - 6:03 AM

Parcelableの使い方について

Parcelableの使い方について

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class SubActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        // IntentからParcelableを取り出し
        Intent i = getIntent();
        MyParcelable p = i.getParcelableExtra(MyParcelable.EXTRA_PARCELABLE);

        TextView title = (TextView) findViewById(R.id.title);
        title.setText(p.mTitle);

        ImageView image = (ImageView) findViewById(R.id.image);
        image.setImageBitmap(p.mBitmap);
    }
}
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

public class MyParcelable implements Parcelable {

    public String mTitle;
    public Bitmap mBitmap;
    public static final String EXTRA_PARCELABLE = "mekeizu.com.parcelappsample.PARCELABLE";

    // インスタンス生成時に値を保存する
    public MyParcelable(String title, Bitmap bitmap) {
        this.mTitle = title;
        this.mBitmap = bitmap;
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mTitle);
        dest.writeParcelable(mBitmap, flags);
    }

    // Parcelableインタフェースを実装したクラスは、
    // Parcelable.Creatorインタフェースを実装するオブジェクトである
    // CREATORという名前のStatic(静的)フィールドを持つ必要があります。
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        @Override
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

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

    private MyParcelable(Parcel in) {
        // writeToParcelで保存した順番で読み出す(重要)
        mTitle = in.readString();
        mBitmap = in.readParcelable(Bitmap.class.getClassLoader());
    }
}
/*
    Intentに対してString や intなどのプリミティブな値を格納するのは容易だ(※1)
    しかし格納する値のデータ構造が複雑になってくると、独自オブジェクトのインスタンスを丸ごと格納したくなる。
    その時にParcelableを使うと一度にまとめて送る事が可能になる。

    ※1 String は厳密に言うとプリミティブな型じゃないけど、大抵のメソッドでまるでプリミティブな型の様に使う事が出来る
*/
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       // icon.png を使用、大きすぎるとアプリ事落ちるので64x64辺りを推奨
        Resources r = getResources();
        final Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.icon);

        Button btn = (Button) findViewById(R.id.parceble_button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setClass(MainActivity.this, SubActivity.class);

                // Parcelableに String と Bitmap をセット
                MyParcelable p = new MyParcelable("Parcelableのテスト", bmp);

                // IntentにParcelableをセット
                i.putExtra(MyParcelable.EXTRA_PARCELABLE, p);

                startActivity(i);
            /*
                やろうと思えばParcelableを使わなくても以下のように出来るが、
                もし更に渡す値が増えていくとどうなるか?

                public static final String EXTRA_STRING = "mekeizu.com.parcelappsample.STRING";
                public static final String EXTRA_IMAGE = "mekeizu.com.parcelappsample.IMAGE";

                i.putExtra(EXTRA_STRING, "Parcelableのテスト");
                i.putExtra(EXTRA_IMAGE, bmp);
            */
            }
        });
    }
}