T307 Parcelのテスト Intentの引数としてクラスを送る
手順としては
implements Parcelableしたクラスを作る(今回はMyPointクラス)
- implements Parcelable
すると自動生成で以下のようになる
public class Hoge implements Parcelable { @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel arg0, int arg1) { // TODO Auto-generated method stub } }
- 以下の手順で記述して完成
package com.efolab.t307; import android.os.Parcel; import android.os.Parcelable; public class Hoge implements Parcelable { //(1) implements Parcelable /* * (3)インスタンス変数を宣言する * lat , lng */ private double lat , lng; /* * (4)private コンストラクタを実装する */ private Hoge(Parcel in){ lat = in.readDouble(); lng = in.readDouble(); } /* * (5)public コンストラクタを実装する */ public Hoge(double x, double y){ lat = x; lng = y; } /* * (1)--自動生成される * @see android.os.Parcelable#describeContents() */ @Override public int describeContents() { //ここは自動生成のまま return 0; } @Override public void writeToParcel(Parcel out, int flags) { /* * (2)自動生成された部分の引数名を変更する * arg0 を out * arg1 を flags */ /* * (4) * インスタンス変数への実装 */ out.writeDouble(lat); out.writeDouble(lng); } /* * (6) * Parcelable.Creatorを実装する * private static final Creator<Hoge> CREATOR まで入力して自動生成 * <?>をクラス名に変更する <Hoge> * で自動FIX * The type new Parcelable.Creator<T>(){} must implement the inherited abstract method Parcelable.Creator<T>.newArray(int) * すると、createFromParcelメソッドとnewArrayメソッドが生成されるので修正する */ @SuppressWarnings("unused") private static final Creator<Hoge> CREATOR = new Parcelable.Creator<Hoge>() { @Override public Hoge createFromParcel(Parcel in) { //(7)引数を source -> in に変更する //(8)return を null -> new Hoge(in)に変更する return new Hoge(in); } @Override public Hoge[] newArray(int size) { //(9)return を null -> new Hoge[size] に変更する return new Hoge[size]; } }; /* * (10)最後にゲッターを記述する */ public double getLat(){ return this.lat; } public double getLng(){ return this.lng; } }
動作
MyPoint.java
implements Parcelable
package com.efolab.t307; import android.os.Parcel; import android.os.Parcelable; public class MyPoint implements Parcelable{ private double lat , lng; private MyPoint(Parcel in){ lat = in.readDouble(); lng = in.readDouble(); } public MyPoint(double x, double y){ lat = x; lng = y; } @SuppressWarnings("rawtypes") public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public Object createFromParcel(Parcel in) { // TODO Auto-generated method stub return new MyPoint(in); } @Override public Object[] newArray(int size) { // TODO Auto-generated method stub return new MyPoint[size]; } }; @Override public void writeToParcel(Parcel out, int flags) { // TODO Auto-generated method stub out.writeDouble(lat); out.writeDouble(lng); } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } public double getLat(){ return this.lat; } public double getLng(){ return this.lng; } }
Main.java
package com.efolab.t307; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; public class Main extends Activity { Activity activity; Context context; LinearLayout base; Intent intent; Button btn0 , btn1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activity = (Activity)this; context = getApplicationContext(); base = new LinearLayout(context); base.setOrientation(LinearLayout.VERTICAL); setContentView(base); btn0 = new Button(context); btn0.setText("int型で送るよ"); btn1 = new Button(context); btn1.setText("クラスごとParceldeで送るよ"); base.addView(btn0); base.addView(btn1); //listener btn0.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub intent = new Intent(context , ReceiveActivity.class); intent.setFlags(0); intent.putExtra("lat", 100); intent.putExtra("lng", 19); activity.startActivity(intent); } }); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { double lat = 43.22; double lng = 220.3; MyPoint point = new MyPoint(lat , lng); intent = new Intent(context , ReceiveActivity.class); intent.setFlags(1); intent.putExtra("point", point); activity.startActivity(intent); } }); } }
ReceiveActivity.java
package com.efolab.t307; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class ReceiveActivity extends Activity { Context context; LinearLayout base; TextView tv0, tv1; Button btn; @Override protected void onCreate(Bundle bundle) { // TODO Auto-generated method stub super.onCreate(bundle); context = getApplicationContext(); base = new LinearLayout(context); base.setOrientation(LinearLayout.VERTICAL); setContentView(base); tv0 = new TextView(context); tv1 = new TextView(context); tv0.setText("なし"); tv1.setText("なし"); btn = new Button(context); btn.setText("close"); base.addView(tv0); base.addView(tv1); base.addView(btn); // Bundle switch (getIntent().getFlags()) { case 0: Bundle extras = getIntent().getExtras(); if (extras != null) { tv0.setText("putExtrasで送られたlat:" + extras.getInt("lat")); tv1.setText("putExtrasで送られたlng:" + extras.getInt("lng")); } break; case 1: Bundle ext = getIntent().getExtras(); if (ext.containsKey("point")) { Toast.makeText(getApplicationContext(), "pointあり", Toast.LENGTH_SHORT).show(); MyPoint point = ext.getParcelable("point"); tv0.setText("MyPointクラスをParcelして送られたlat:" + point.getLat()); tv1.setText("MyPointクラスをParcelして送られたlng:" + point.getLng()); } break; } btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub finish(); } }); } }