`
GhostFromheaven
  • 浏览: 397016 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Android Activity间传递自定义类的对象

阅读更多
有很多时候都需要在不同的Activity之间传递数据。
实现方法有很多,可以用Bundle来传递,也可以用给Intent用putExtra传递附加参数。
当然也可以传递自定义类的对象。为了让自定义类可以在Activity之间传递,必须符合一些条件。常用的方法是自定义类实现Parcelable接口或Serializable接口。Android中建议实现Parcelable。
下面例子中两种方法都有例子。
传递Parcelable过去,再传递Serializable回来。





WeightParcelable.java
import android.os.Parcel;
import android.os.Parcelable;

public class WeightParcelable implements Parcelable {
	private String sex;
	private double height;
//必须的空构造器,因为下面有一个私有的构造器,否则不能new对象
	public WeightParcelable() {

	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	@Override
	public int describeContents() {
		return 0;
	}
//需要覆盖的方法
	@Override
	public void writeToParcel(Parcel out, int flags) {
		out.writeString(sex);
		out.writeDouble(height);
	}
//关键的事情
	public static final Parcelable.Creator<WeightParcelable> CREATOR = new Parcelable.Creator<WeightParcelable>() {
		public WeightParcelable createFromParcel(Parcel in) {
			return new WeightParcelable(in);
		}

		public WeightParcelable[] newArray(int size) {
			return new WeightParcelable[size];
		}
	};
//
	private WeightParcelable(Parcel in) {
		sex = in.readString();
		height = in.readDouble();
	}
}


HeightSerializable.java
import java.io.Serializable;

public class HeightSerializable implements Serializable {
	private static final long serialVersionUID = 8502706820090766507L;
	private String sex;
	private double weight;

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public double getWeight() {
		return weight;
	}

	public void setWeight(double weight) {
		this.weight = weight;
	}

}


EX03_10.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;

public class EX03_10 extends Activity {
	/** Called when the activity is first created. */
	public static final String parcelableKey = "irdc.ex03_10.parcelableKey";
	public static final String seralizableKey = "irdc.ex03_10.seralizableKey";
	private static final String TAG = "EX03_10";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button b1 = (Button) findViewById(R.id.button1);
		b1.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				EditText et = (EditText) findViewById(R.id.height);
				double height = Double.parseDouble(et.getText().toString());
				String sex = "";
				RadioButton rb1 = (RadioButton) findViewById(R.id.sex1);
				if (rb1.isChecked()) {
					sex = "M";
				} else {
					sex = "F";
				}
				Intent intent = new Intent();
				intent.setClass(EX03_10.this, EX03_10_1.class);

				Bundle bundle = new Bundle();

				WeightParcelable wp = new WeightParcelable();
				wp.setSex(sex);
				wp.setHeight((int) height);

				bundle.putParcelable(parcelableKey, wp);
				intent.putExtras(bundle);
//注意这里
				startActivityForResult(intent, 1);
			}
		});
	}
//这个是关键
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d(TAG, "onActivityResult requestCode=" + requestCode
				+ " resultCode= " + resultCode + " data == null["
				+ (data == null) + "]");

		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == 1) {
			if (resultCode == RESULT_OK) {
				try {
					HeightSerializable hs = (HeightSerializable) data
							.getSerializableExtra(seralizableKey);

					TextView textView4 = (TextView) findViewById(R.id.text4);
					textView4.setText("性别:" + hs.getSex() + "\n标准体重:"
							+ hs.getWeight());

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

}


EX03_10_1.java
import java.text.DecimalFormat;
import java.text.NumberFormat;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class EX03_10_1 extends Activity {
	private static final String TAG = "EX03_10_1";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.myalyout);

		WeightParcelable wp = (WeightParcelable) getIntent()
				.getParcelableExtra(EX03_10.parcelableKey);

		String sex = wp.getSex();
		double height = wp.getHeight();

		String sexText = "";
		if (sex.equals("M")) {
			sexText = "男性";
		} else {
			sexText = "女性";
		}

		String weight = this.getWeight(sex, height);

		TextView tv1 = (TextView) findViewById(R.id.text1);
		tv1.setText("性别:" + sexText + "\n身高:" + height + "厘米\n标准体重: " + weight
				+ "公斤");

		// 返回对象
		Intent data = new Intent();
		HeightSerializable hs = new HeightSerializable();
		hs.setSex(sexText);
		hs.setWeight(Double.valueOf(weight));

		data.putExtra(EX03_10.seralizableKey, hs);
//从这里返回对象
		setResult(RESULT_OK, data);
	}

	private String format(double num) {
		NumberFormat formatter = new DecimalFormat("0.00");
		String s = formatter.format(num);
		return s;
	}

	private String getWeight(String sex, double height) {
		String weight = "";
		if (sex.equals("M")) {
			weight = format((height - 80) * 0.7);
		} else {
			weight = format((height - 70) * 0.6);
		}
		return weight;
	}
}
  • 大小: 26.8 KB
  • 大小: 19.8 KB
  • 大小: 28.9 KB
分享到:
评论
3 楼 GhostFromheaven 2011-05-21  
whao189 写道
我有个问题。。想 请教一下。。

是这样的

@Override 
    public void writeToParcel(Parcel out, int flags) {  
        out.writeString(sex);  
        out.writeDouble(height);  
    }  

private WeightParcelable(Parcel in) {  
        sex = in.readString();  
        height = in.readDouble();  
    }  


这个地方如果 sex height 的类型 都是一样 的 加入都是string 怎么 处理呢??

你在readString 的 时候 Parcel会帮你 自动的  比对数据么?

希望楼主能指点一二!


可以都加入String.其实它内部是用map实现的,是key-value对。
2 楼 whao189 2011-05-19  
我有个问题。。想 请教一下。。

是这样的

@Override 
    public void writeToParcel(Parcel out, int flags) {  
        out.writeString(sex);  
        out.writeDouble(height);  
    }  

private WeightParcelable(Parcel in) {  
        sex = in.readString();  
        height = in.readDouble();  
    }  


这个地方如果 sex height 的类型 都是一样 的 加入都是string 怎么 处理呢??

你在readString 的 时候 Parcel会帮你 自动的  比对数据么?

希望楼主能指点一二!
1 楼 windloverain 2010-12-01  
不错,学习了,一会试试。

相关推荐

    Android Parcelable序列化自定义类集合在Activity间传递

    综上所述,要理解并实现Android中Parcelable序列化自定义类集合在Activity间传递,开发者需要掌握Parcelable接口的使用、自定义类的Parcelable实现、集合处理、Intent数据传递,以及可能借助的源码阅读和辅助工具。...

    JNI 参数传递 Android 自定义对象

    传递自定义Java对象到JNI层则相对复杂,因为需要处理对象引用和对象内部的数据。首先,你需要使用`FindClass`方法获取Java类的本地表示,然后通过`NewObject`创建实例。对于传递的对象,需要定义对应的结构体来存储...

    Android使用AIDL完成自定义对象的远程传递示例

    本示例主要探讨如何通过AIDL实现自定义对象的远程传递,这在多进程协作或服务通信中非常常见。 首先,我们需要了解AIDL的基本概念。AIDL文件是一种接口定义文件,它允许我们声明方法签名,这些方法将在服务和客户端...

    intent传递自定义对象

    当我们需要在Intent中传递自定义对象时,Android提供了几种方式来实现这一功能,其中一种常用的方法是将自定义对象转换为Serializable接口的实现。以下我们将详细探讨如何通过Intent传递自定义对象以及涉及到的相关...

    Activity跳转时传递Bitmap对象

    在Android开发中,Activity之间的数据传递是常见的操作,特别是在处理图像数据时,如Bitmap对象。Bitmap是Android系统中用于表示图像的重要类,它包含了图像的所有像素信息。在不同Activity之间传递Bitmap,通常是...

    android 传递对象

    在DEMO Trans Object中,通常会展示如何创建一个自定义类,实现Parcelable接口,并在Activity之间通过Intent传递这个自定义对象。DEMO可能包括以下步骤: 1. 创建自定义类并实现Parcelable接口。 2. 在自定义类中...

    android 自定义AlertDialog 与Activity相互传递数据

    1、从Activity的TextView中获取字符串设置到AlertDialog的TextView和EditText中 2、将AlertDialog的EditText中的值设置到Activity的TextView中 新手在自定义AlertDialog上的疑问笔者猜测主要有两个: 1、自定义的...

    诠释Android中Activity间的参数互传

    对于性能要求较高的场景,可以使用实现Parcelable接口的自定义对象作为参数传递。Parcelable比Serializable效率更高,但编写代码相对复杂。示例: ```java public class CustomObject implements Parcelable { // ...

    Android aidl实现传递对象

    // 声明自定义对象为Parcelable interface IAidlInterface { void passObject(MyObject obj); // 定义传递对象的方法 } ``` 这里的`MyObject`必须实现`Parcelable`接口,这是Android系统中唯一能跨进程传递的...

    eclipse 下的android Activity值传递

    在Eclipse环境下开发Android应用时,理解并掌握Activity之间的值传递至关重要。本文将详细探讨在Eclipse下如何进行Android Activity的值传递。 首先,Activity之间的值传递主要通过Intent对象实现。Intent不仅用于...

    Android例子源码Activity间的数据传递

    这个"Android例子源码Activity间的数据传递"着重展示了如何在不同的Activity之间有效地传递数据。以下是关于这个主题的详细解释: 1. **Intent**: Intent是Android中用于启动其他组件(如Activity、Service)或传递...

    activity值传递

    如果需要传递复杂对象,如自定义类实例,那么这个类需要实现Parcelable接口或Serializable接口。Parcelable是更高效的数据序列化方式,适合频繁传递数据;而Serializable接口相对简单,但效率较低。对于Parcelable...

    Activity之间传递对象的Demo

    为了让自定义对象能够通过Intent传递,我们需要让该类实现Parcelable接口。实现这个接口需要编写以下方法: 1. `public int describeContents()`:返回当前对象的内存引用,通常返回0。 2. `public void ...

    两个Activity之间传递参数的代码

    Intent是Android中用来启动Activity或Service的类,也可以用于在Activity间传递数据。对于简单的数据类型(如字符串、整型、浮点型、布尔型等),我们可以在创建Intent时直接附加数据。 例如,在`LoginActivity....

    android Activity之间的数据传递

    - **Parcelable接口**:对于自定义对象,可以实现Parcelable接口,使其能够作为Intent的额外数据进行传递。这种方式效率较高,但编写代码相对复杂。 - **Serializable接口**:另一种传递复杂数据的方式是实现...

    两个Activity在调用StartActivity的时候传递序列化信息

    1. **创建可序列化的对象**:确保你要传递的自定义类实现了Serializable接口。例如,我们有一个User类: ```java public class User implements Serializable { private String name; private int age; // 构造...

    Android PopupWindow与Activity之间的数据传递.zip

    当PopupWindow需要向Activity传递数据时,只需调用已实现的接口方法即可。这样做的好处是保持了PopupWindow和Activity之间的解耦。 3. **静态变量**:创建全局静态变量,可以方便地在PopupWindow和Activity之间共享...

    Android Activity间传值

    首先,Intent是Android系统用于启动新Activity或服务的类,它是Activity间通信的主要桥梁。在传递数据时,我们可以创建一个Intent对象,然后使用putExtra()方法添加键值对,将数据存储到Intent的Extras中。例如: `...

    Android Activity间共享数据

    可以传递基本类型、Parcelable接口实现类(如自定义对象)、Serializable接口实现类等。以下是一个简单的示例: ```java // 在启动新Activity时通过Intent传递数据 Intent intent = new Intent(this, TargetActivity...

Global site tag (gtag.js) - Google Analytics