1

我有一个对象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”行时,它总是崩溃。它可能与 to to 的演员阵容有关Parcelable。所以,我假设这不是传递对象的正确方法?

任何有关如何正确传递对象的提示将不胜感激。

4

5 回答 5

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。

于 2013-08-31T17:54:31.207 回答
0

要将对象转换Parcelable为 ,该对象的类应该是Parcelable。因此,您需要Parcelable按照上面的建议实现接口。

于 2013-08-31T18:57:43.523 回答
0

编辑:刚刚意识到这是很老的帖子:)

Parcelable 是最佳实践,但是编写代码和维护它是很乏味的。该网站可以为此提供帮助

打包机

注意:我没有尝试过用这个创建的 Parcelable,因为我没有遇到需要,但是值得一试

于 2014-12-23T11:05:18.033 回答
0

您可以使用可序列化来完成您的工作..这是最简单的方法...这里

于 2014-04-11T06:04:12.063 回答
0

Serializable您可以使用接口轻松地在意图中传递对象。为此,您传递的对象应该是类实现Serializable接口的实例。这是一个将对象从一个 Intent 传递到另一个 Intent 的简单示例。在此示例中,testObject类的对象TestClass已从 传递MainActivityNewActivity

活动主.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" />

活动新的.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);
    }
}

测试类.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;
    }
}

新活动.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]);
    }
}

希望这个例子对你有所帮助。

于 2015-08-09T17:22:27.460 回答