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);
*/
}
});
}
}