[英]Passing objects between activities in Android
我有一個對象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
轉換為Parcelable
。 所以,我假設這不是傳遞對象的正確方法?
任何有關如何正確傳遞對象的提示都將非常感激。
你需要做這樣的事情:
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。
要將對象轉換為Parcelable
,該對象的類應為Parcelable
。 因此,您需要按照上面的建議實現Parcelable
接口。
您可以使用serializable來完成工作..這是最簡單的方法...... 在這里
編輯:剛剛意識到這是非常老的帖子:)
Parcelable是最佳實踐,但編寫代碼並維護它是非常繁瑣的。 這個網站可以為此提供幫助
注意:我沒有嘗試用這個創建的Parcelable,因為我沒有面對需要,但是值得一試
您可以使用Serializable
接口輕松傳遞意圖內的對象。 為此,您傳遞的對象應該是實現Serializable
接口的類的實例。 這是一個將對象從一個Intent傳遞到另一個Intent的簡單示例。 在此示例中,類TestClass
的對象testObject
已從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]);
}
}
希望這個例子能幫到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.