我有一个对象Address
,其值包括:姓名,地址,城市,州,邮编,电话等。
我使用HTTP调用填充对象。此变量确实已填充。然后我尝试通过这样做将对象传递给下一个活动:
Intent intent = new Intent(NewAddressActivity.this, BuildingTypeActivity.class);
Bundle b = new Bundle();
b.putParcelable("newAddress", (Parcelable)newAddress); // i had to cast 'newAddress' to 'Parcelable' otherwise, it was giving me an error
intent.putExtra("newAddress", b);
startActivity(intent);
在下一个活动(BuildingTypeActivity)中,我像这样获取对象。
Bundle b = this.getIntent().getExtras();
if (b != null) {
Address address = b.getParcelable("newAddress");
}
问题是,当它到达'putParcelable'行时它总是崩溃。它可能与转换为Parcelable
有关。所以,我假设这不是传递对象的正确方法?
非常感谢有关如何正确传递对象的任何提示。
答案 0 :(得分:3)
你需要做这样的事情:
import android.os.Parcel;
import android.os.Parcelable;
public class Address implements Parcelable {
private String name, address, city, state, phone, zip;
@Override
public int describeContents() {
return 0;
}
/*
THE ORDER YOU READ OBJECT FROM AND WRITE OBJECTS TO YOUR PARCEL MUST BE THE SAME
*/
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeString(address);
parcel.writeString(city);
parcel.writeString(state);
parcel.writeString(phone);
parcel.writeString(zip);
}
public Address(Parcel p){
name = p.readString();
address = p.readString();
city = p.readString();
state = p.readString();
phone = p.readString();
zip = p.readString();
}
// THIS IS ALSO NECESSARY
public static final Creator<Address> CREATOR = new Creator<Address>() {
@Override
public Address createFromParcel(Parcel parcel) {
return new Address(parcel);
}
@Override
public Address[] newArray(int i) {
return new Address[0];
}
};
}
现在你不必将newAddress实例转换为Parcelable。
答案 1 :(得分:0)
要将对象转换为Parcelable
,该对象的类应为Parcelable
。因此,您需要按照上面的建议实现Parcelable
接口。
答案 2 :(得分:0)
您可以使用serializable来完成工作..这是最简单的方式...... here
答案 3 :(得分:0)
Parcelable是最好的做法,但编写代码并维护它是非常繁琐的。这个网站可以为此提供帮助
注意:我没有尝试用这个创建的Parcelable,因为我没有面对需要,但是值得一试
答案 4 :(得分:0)
您可以使用Serializable
界面轻松传递意图内的对象。
为此,您传递的对象应该是实现Serializable
接口的类的实例。
这是一个将对象从一个Intent传递到另一个Intent的简单示例。
在此示例中,类testObject
的对象TestClass
已从MainActivity
传递到NewActivity
。
activity_main.xml中:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Here"
android:id="@+id/button"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:onClick="changeIntent" />
activity_new.xml:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
MainActivity.java:
package com.example.nabin.serializabledemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
public class MainActivity extends ActionBarActivity {
TestClass testObject;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testObject = new TestClass("Name");
}
public void changeIntent(View v){
intent = new Intent(MainActivity.this,NewActivity.class);
intent.putExtra("sampleObject", testObject);
startActivity(intent);
}
}
TestClass.java:
package com.example.nabin.serializabledemo;
import java.io.Serializable;
public class TestClass implements Serializable{
String classname;
int no = 1;
String [] sampleArray = {"Apple", "Banana"};
public TestClass(String name){
classname = name;
}
}
NewActivity.java:
package com.example.nabin.serializabledemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
public class NewActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
Intent i = getIntent();
TestClass tc = (TestClass)i.getSerializableExtra("sampleObject");
String name = tc.classname;
int no = tc.no;
String [] array = tc.sampleArray;
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("Name: "+name+"\nno: "+no+"\nArray: "+ array[0]+" " + array[1]);
}
}
希望这个例子能帮到你。