たぼさんの部屋

いちょぼとのんびり

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;
	}
}

動作

f:id:donsuka_kk:20121213183110p:plain
f:id:donsuka_kk:20121213183117p:plain

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();
			}
		});

	}

}