繁体   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