2014-07-18 2 views
1

"filmovi"라는 객체를 다른 활동으로 보내면 오류가 발생합니다. 오류가 발생했습니다. 내가 "korisnik"이라는 다른 객체를 보내려고했을 때 문제없이 작동합니다. 활동하나의 객체에서 다른 객체로 전송할 수있는 오류가 발생했습니다.

filmovi filmoviRezervacija에서 기기 수령 활동

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

에서 보내기

오류

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

;

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


} 

답변

0

이유는 filmovi 클래스는

parcelable interface를 구현해야 filmovi, 또는 그 문제에 대한 모든 클래스, parcelable, 클래스와 그 내부의 모든 구성원을하려면 parcelable 및 구현되지 않는 것입니다 writeToParcel 느슨하게 말하면 클래스의 콘텐츠를 스트리밍하는 방법입니다. 예를

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

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

은 여기

은, MyClass에이 parcelable을 구현하는 것으로는 충분하지 않습니다.

MyMemberDataClass (즉, 내부 멤버 클래스)도 그렇게해야합니다.


이 복잡 내기 수 있습니다. 또한 많은 경우에 실제로 필요하지는 않습니다 ... 액티비티 필수 매개 변수 을 모두 전달해야하는 activity-parameters 정적 객체를 사용하는 것이 좋습니다. :

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

: 이것은 을위한 좋은 연습이다, 또한 kcoppock의 의견에 대한 답변입니다

class RezervacijaActivity { 

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

} 

주, 그리고 :

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

및 RezervacijaActivity의에서 onCreate에 귀하의 활동을 으로 가져 오면 바로 검색합니다..

+0

정적 데이터 멤버를 사용하는 것은 매우 바람직하지 않습니다. 어딘가에 디스크에 저장하거나 올바르게 직렬화하거나 분할 할 수있게하십시오. 구현하기가 너무 어렵지 않습니다. – kcoppock

0

편집 : kcoppock가 언급 한 바와 같이 그들이 직렬화 또는 parcelable 아니라면, 당신이 엑스트라로 텐트에 오브젝트를 배치 할 수 없습니다. 따라서 Film 클래스는 그 중 하나를 구현해야합니다. 인텐 트에만 기본 유형 (int, 등)을 추가 한 적이 있으므로이 사실을 알지 못했습니다. 조심해야 할 것이있다!

제쳐두고 정적 최종 값으로 키 문자열을 추출하는 것이 좋습니다. 이렇게하면 동일한 문자열이 사용하는 각 위치에서 끝납니다.

관련 문제