【问题标题】:Parcelable error sending object from one to another activity将对象从一个活动发送到另一个活动的可打包错误
【发布时间】:2014-09-09 22:37:38
【问题描述】:

当我将我的对象“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);

积极参与

影片

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


}

【问题讨论】:

    标签: android parcelable serializable


    【解决方案1】:

    原因是你的 filmovi 类不可打包

    要使 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 评论的回答,这是一个很好的做法 您的活动以在检索静态数据后立即清除它

    【讨论】:

    • 强烈建议不要使用静态数据成员。要么将其保存到磁盘的某个地方,要么使其正确可序列化或可打包。实施起来并不难。
    【解决方案2】:

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

    顺便说一句,将键字符串提取为静态最终值是一种很好的做法。这样可以确保在您使用它的每个位置都使用相同的字符串。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 2016-01-05
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2013-01-12
      • 2019-07-31
      • 2017-01-07
      • 1970-01-01
      相关资源
      最近更新 更多