将对象从一个活动发送到另一个活动的可分配错误

时间:2014-07-18 17:48:23

标签: android parcelable serializable

当我发送对象时,我无法解决问题" filmovi"到另一个活动我得到了一个错误。当我试图发送另一个物体" korisnik"它没有任何问题。

错误

FATAL EXCEPTION: main
java.lang.ClassCastException: ba.fit.kino.model.filmovi cannot be cast to android.os.Parcelable

从活动发送

filmovi Film = ((filmovi)lstView.getItemAtPosition(position)); 
Intent intent = new Intent(getApplicationContext(), RezervacijaActivity.class)
intent.putExtra("Rezervacija", Film);
startActivity(intent);

活动中的回收

filmovi filmoviRezervacija;

Bundle bundle = getIntent().getExtras();

if(bundle != null){
     filmoviRezervacija = bundle.getParcelable.("Rezervacija"); 
}

我解决了这个问题:

public class filmovi implements Parcelable{......


 public filmovi (Parcel source)
    {

        this.setFilmID(source.readInt());
        this.setNaziv(source.readString());
        this.setCijenaKarte(source.readFloat());
        this.setSalaID(source.readInt());

    }

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

    @Override
    public void writeToParcel(Parcel dest,int flags)
    {
        dest.writeInt(this.filmID);
        dest.writeString(this.naziv);
        dest.writeFloat(this.cijenaKarte);
        dest.writeInt(this.salaID);
    }


    public static final Parcelable.Creator<filmovi> CREATOR = new Parcelable.Creator<filmovi>() {
        @Override
        public filmovi createFromParcel(Parcel source) {
            return new filmovi(source);
        }

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


}

2 个答案:

答案 0 :(得分:0)

编辑:正如kcoppock所提到的,除非它们是可序列化的或可分割的,否则你不能将对象作为额外内容放入Intent中。因此,您的Film类需要实现其中之一。我只在Intents中添加了原生类型(int等),所以我不知道这一点。需要注意的事情!

顺便说一下,将关键字符串提取为静态最终值是一种好习惯。这可以确保在您使用它的每个位置都会出现相同的字符串。

答案 1 :(得分:0)

原因是你的filmovi课程不可分割

为了制作电影,或任何课程,可以提供,班级及其所有内部成员应该 实施parcelable interface ,并实现一个松散的 writeToParcel 方法 传播课堂内容。

这里,例如

class MyClass implements parcelable {
    private MyMemberDataClass data;  <----- must also implement parcelable 

    void writeToParcel(Parcel dest, int flags) {...}
}

MyClass实现parcelable是不够的。

MyMemberDataClass(即内部成员类)也必须这样做。


这可能会让人感到困惑。在许多情况下,它也没有必要......

相反,请考虑使用您将传递所有内容的活动参数静态对象 您的活动需要参数,而无需包裹它们!

filmovi Film = ((filmovi)lstView.getItemAtPosition(position)); 
Intent intent = new Intent(getApplicationContext(), RezervacijaActivity.class)
RezervacijaActivityParams.setValue(Film); <--------------- instead of putExtra()
startActivity(intent);

其中:

class RezervacijaActivityParams {
       private static filmovi Film;
       public static void getValue(filmovi f) { Film = f; }
       public static filmovi getValue() { return Film; }
}

和RezervacijaActivity的onCreate:

class RezervacijaActivity  {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        filmovi = RezervacijaActivityParams.getValue();
        RezervacijaActivityParams.setValue(null); <---------- clear static data
    }

}

请注意,这也是对kcoppock评论的回答,这是一个很好的做法 您的活动在检索后立即清除静态数据