gpt4 book ai didi

android - 尝试使用 Intent 将实现 parcelable 的自定义对象传递给另一个 Activity 时出现 ClassCastException

转载 作者:行者123 更新时间:2023-11-30 03:16:18 24 4
gpt4 key购买 nike

我有自己的对象 SineWave,我需要将其从 SettingsActivity 传递到 SimulationActivity

但是当我将 SineWave[] 转换为 Parceable[] 时,它给出了一个类转换异常。

正弦波对象:-

public class SineWave implements Parcelable{
float A,k,w,phi,VELOCITY;
int waveNum;
boolean plot;

public SineWave(Parcel in){
A=in.readFloat();
k=in.readFloat();
w=in.readFloat();
phi=in.readFloat();
VELOCITY=in.readFloat();
waveNum=in.readInt();
plot=in.readInt()==1;
}

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

@Override
public void writeToParcel(Parcel out, int flags) {
out.writeFloat(A);
out.writeFloat(k);
out.writeFloat(w);
out.writeFloat(phi);
out.writeFloat(VELOCITY);
out.writeInt(waveNum);
out.writeInt(plot ? 1 : 0);
}

public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
public SineWave createFromParcel(Parcel in) {
return new SineWave(in);
}

public SineWave[] newArray(int size) {
return new SineWave[size];
}
};
}

设置 Activity :-

waveList = new ArrayList<SineWave>();

@Override
public void onClick(View view){
switch(view.getId()){
case R.id.start:
Intent i1 = new Intent();
i1.setClass(this, SimulationActivity.class);
i1.putExtra("list",(Parcelable[])(waveList.toArray()));
//Gives ClassCastException at above line
startActivity(i1);
break;
case R.id.add_wave:
...
break;
default: break;
}
}

模拟 Activity :-

public void onCreate(Bundle icicle){
...
Intent i = getIntent();
SineWave[] waveList[]=(SineWave[])i.getParcelableArrayExtra("list");
...
}

错误堆栈跟踪:-

Caused by: java.lang.ClassCastException: [Ljava.lang.Object;
at com.meet.simulators.wavesonstringsimulator.SettingsActivity.onClick(SettingsActivity.java:37)            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at android.view.View$1.onClick(View.java:2139)
            at android.view.View.performClick(View.java:2485)
            at android.view.View$PerformClick.run(View.java:9080)
            at android.os.Handler.handleCallback(Handler.java:587)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:3683)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
            at dalvik.system.NativeStart.main(Native Method)

不明白问题是什么?请帮忙。

最佳答案

您不能将对象数组(这是 waveList.toArray() 给您的)直接转换为另一种类型的数组。您也只需要转换为 SineWave,因为它已经是一个 Parcelable。我相信这就是您可以做到的:

i1.putExtra("list", waveList.toArray(new SineWave[waveList.size()]));

有关信息,putExtra 的文档说明:

向 Intent 添加扩展数据。该名称必须包含包前缀,例如应用程序 com.android.contacts 将使用类似“com.android.contacts.ShowAll”的名称。

我不知道这可能会产生什么影响,但您可能还需要在“列表”前面添加您的包名称。

关于android - 尝试使用 Intent 将实现 parcelable 的自定义对象传递给另一个 Activity 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20049066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com