`
GhostFromheaven
  • 浏览: 394395 次
  • 性别: 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间传递

    NULL 博文链接:https://2528.iteye.com/blog/1849692

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

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

    Android中传递对象

    我们有时由于程序某种需要,可能需要传递各种各样的自定义对象,只传递简单类型的数据是不够的。但这些对象在Activity之间不能直接传递,用什么方法去解决? 方法一:将一个公共类作为对象传输中介,但安全性差,...

    Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法

    Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object要实现Serializable接口,后面一种方法中...

    Android 不同Activity间数据的传递 Bundle对象的应用

    在应用中,可能会在当跳转到另外一个Activity的时候需要传递数据过去,这时就可能用Bundle对象; 在MainActivity中,有一个导航至BActivity的Intent, Intent 代码如下:{  Intent intent = new Intent(Context ...

    Android Activity之间的数据传递方法总结

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递方法。 1、通过 Intent 传递 我们在进行 Activity 跳转时,是要有 Intent,此时 ...

    Android中Intent传递对象的3种方式详解

    相信Intent的用法大家已经比较熟悉了,Intent可以用来启动Activity,Service等等,同时我们也可以通过Intent来进行传递数据,当我们使用Intent在Activity 间传递信息时发现putExtra() 方法并不支持自定义对象的传输...

    activity间数据的传递列表显示

    首先是Intent自定义数据的传送,之后银行账号的输入格式的控制,之后界面销毁时数据的返回,将跟新了的数据返回给上一层的activity

    深入理解Activity之间的数据传递

    Android的设计原则是,用Intent在不同的Activity和进程之间进行通信,但是通常来讲,Intent中只能存入基本数据类型和系统默认支持的比如Uri之类的。那么对于用户自己定义的数据结构是无法直接用Intent来传送的,如果...

    谈谈Android里的Context的使用

    import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import ...

    android Parcelable

    在Android开发过程中,经常要在Activity之间传递参数,使用Android系统提供的方法可以传递基本数据类型的变量,但有时候我们经常要传递一些复杂的数据类型或自定义的类,这种情况的参数无法直接传递,我们可以通过...

    Android动态加载Activity原理详解

    加载一个Activity肯定不会像加载一般的类那样,因为activity作为系统的组件有自己的生命周期,有系统的很多回调控制,所以自定义一个DexClassLoader类加载器来加载插件中的Activity肯定是不可以的。 首先不得不了解...

    Android 自定义Dialog接口回调参数

    该项目的主要功能是如何自定义Dialog,并通过接口回调的方式把参数传递到activity或者Fragment,主要强调的是一种思想,同时,也阐述了如何改变一个字符串中某部分文字的颜色,需要的小伙伴可以下载

    Android入门到精通源代码.

    3.2.2 Activity类的结构 3.3 Activity的两种界面设计方式 3.3.1 基于XML的界面设计 3.3.2 基于代码的界面设计 3.4 应用实例:在界面中显示图片 第4章 Android人机界面和常用组件 4.1 用户人机界面元素分类 4.1.1 ...

    Android开发案例驱动教程 配套代码

    13.3.6 组件间参数传递 343 本章小结 347 第14章 Broadcast Receiver和Notification 348 14.1 Broadcast Receiver 348 14.1.1 音频播放案例 349 14.1.2 编写音频播放Broadcast Receiver 350 14.1.3 注册音频...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    疯狂Android讲义源码

     7.5.3 自定义补间动画 298  7.6 使用SurfaceView实现动画 300  7.6.1 SurfaceView的绘图机制 301  7.7 本章小结 305  第8章 Android的数据存储和IO 306  8.1 使用SharedPreferences 307  8.1.1 ...

Global site tag (gtag.js) - Google Analytics