【问题标题】:How to pass object to another activity如何将对象传递给另一个活动
【发布时间】:2014-05-12 10:14:16
【问题描述】:

我有一个从 Location 类扩展的 Placemark 类,所以我认为在这种情况下我不能在这里使用“实现可序列化”。如果有人知道如何在这里使用 Serializable,请帮助我

public class Placemark extends Location

所以我开始在 other 中使用 Parcelable 将我的 Placemark 对象传递给第二个 Activity

public class DataPass implements Parcelable{

private Placemark pm;

public DataPass() 
{}

public DataPass(Parcel p)
{
    pm = (Placemark) p.readValue(Placemark.class.getClassLoader());    //<~~ may cause problem here
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel p, int flags) {
    p.writeValue(pm);
}

public Placemark getPM() {
    return pm;
}

public void setPM(Placemark pm) {
    this.pm = pm;
}

public static Parcelable.Creator<DataPass> CREATOR = new Parcelable.Creator<DataPass>() {

    @Override
    public DataPass createFromParcel(Parcel source) {
        return new DataPass(source);
    }

    @Override
    public DataPass[] newArray(int size) {
        return new DataPass[size];
    }
};

}

然后从当前活动中调用 putExtra(String, Parcelable) 和 startActivity。

DataPass data = new DataPass();
data.setPM(myPlacemark);
mapintent.putExtra("p", data);
startActivity(mapintent);

然后检索它

Bundle bd = getIntent().getExtras();
try {
    DataPass data = bd.getParcelable("p");    //<~~ Exception
    Placemark pm = data.getPM();
} catch (Exception e)
{
    Log.e("error", e.toString());
}

当我运行这段代码时,我遇到了一个异常 DataPass 数据 = bd.getParcelable("p");

cause: ClassCastException
detailMessage: Location cannot be cast to Placemark)

因此,当从位置扩展地标时,这又是第一个问题。我搜索了很多网站,但仍然无法解决这种情况

【问题讨论】:

    标签: java android


    【解决方案1】:

    1) 代替

     p.writeValue(pm);
    

    pm = (Placemark) p.readValue(Placemark.class.getClassLoader());
    

    试着写:

     p.writeParcelable(pw, 0);
    

    pm = (Placemark) p.readParcelable(Placemark.class.getClassLoader());
    

    2) 你的类 Placemark 是否实现 Parcelable 接口?

    【讨论】:

    • 我的 Placemark 类现在只是从 Location 扩展而来,但我有一个 DataPass 类实现了 Parcelable,就像上面一样,它具有 Placemark 作为属性。我之前尝试过 Placemark 实现 Parcelable 和 Placemark 实现 Serializable 但它似乎对我不起作用,看起来 Placemark extends Location 使这种情况变得更加复杂
    • 你有错误导致 Dalvik 试图将对象转换为 Location 导致你的 Placemark 类扩展它并且没有实现 Parcelable 接口。在您没有在 Placemark 中实现 Parcelable 之前,您将遇到此错误。
    • 我会再试一次,上次我尝试实现 Parcelable,当 Location 的任何子类的构造函数必须有一个 String 提供程序作为参数时,我被卡住了。现在我知道如何解决这个问题了,非常感谢
    • @TamHuynh 很高兴听到它)
    【解决方案2】:

    您可以创建Application 的子类并将对象存储在那里。 Here 就是一个例子。

    【讨论】:

    • 我尝试使用 Appication 的一个子类,它完全可以工作,非常感谢。但后来我认为我应该改为使用静态单例方法,因为我的应用程序只有 2 个活动,并且创建新的应用程序让我觉得它“太大了”。无论如何,您给我的链接对我有很大帮助。
    • 很高兴我能帮上忙。小心使用静态变量。如果您拥有静态变量的活动结束,您将无法在第二个活动中使用该变量。此外,您可以将此答案设置为有用,其他人应该知道您是如何解决问题的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2015-08-26
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多