簡體   English   中英

在Android中的活動之間傳遞對象

[英]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是最佳實踐,但編寫代碼並維護它是非常繁瑣的。 這個網站可以為此提供幫助

Parcelabler

注意:我沒有嘗試用這個創建的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM