簡體   English   中英

嘗試將實現可拆分的自定義對象傳遞給使用Intent的另一個活動時發生ClassCastException

[英]ClassCastException when trying to pass custom object implementing parcelable to another activity using Intent

我有自己的對象SineWave ,需要將其從SettingsActivity傳遞給SimulationActivity

但是當我將SineWave []轉換為Parceable []時,它給出了classcastexception。

SineWave對象:-

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];
            }
        };
}

設置活動:-

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;
    }
}

SimulationActivity:-

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的文檔指出:

將擴展數據添加到該意圖。 該名稱必須包含包前綴,例如,應用程序com.android.contacts將使用“ com.android.contacts.ShowAll”之類的名稱。

我不知道可能會有什么影響,但是您可能還需要在“列表”前面添加包名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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