java - 不在 Activity 之间传递的 Parcelable 数据

标签 java android parcelable

我有一个 List<Movie>我想从一项 Activity 传递到另一项 Activity :

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "CLICKED", Toast.LENGTH_LONG).show();
                Intent i = new Intent(getApplicationContext(), IndividualMovieActivity.class);
                i.putExtra("Movie", mMovieResultsList.get(position));
                startActivity(i);

电影.模型:

public class Movie implements Parcelable {

private int vote_count;
private int id;
private boolean video;
private String title;
private float popularity;
private String poster_path;
private String original_language;
private String original_title;
private ArrayList<String> genre_ids;
private String backdrop_path;
private boolean adult;
private String overview;
private Date release_date;

public Movie(){

}

public Movie(int vote_count, int id, boolean video, String title, float popularity, String poster_path, String original_language, String original_title, ArrayList<String> genre_ids, String backdrop_path, boolean adult, String overview, Date release_date) {
    this.vote_count = vote_count;
    this.id = id;
    this.video = video;
    this.title = title;
    this.popularity = popularity;
    this.poster_path = poster_path;
    this.original_language = original_language;
    this.original_title = original_title;
    this.genre_ids = genre_ids;
    this.backdrop_path = backdrop_path;
    this.adult = adult;
    this.overview = overview;
    this.release_date = release_date;
}

protected Movie(Parcel in) {
    vote_count = in.readInt();
    id = in.readInt();
    video = in.readByte() != 0;
    title = in.readString();
    popularity = in.readFloat();
    poster_path = in.readString();
    original_language = in.readString();
    original_title = in.readString();
    genre_ids = in.createStringArrayList();
    backdrop_path = in.readString();
    adult = in.readByte() != 0;
    overview = in.readString();
}

public static final Creator<Movie> CREATOR = new Creator<Movie>() {
    @Override
    public Movie createFromParcel(Parcel in) {
        return new Movie(in);
    }

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

public void setVote_count(int vote_count) {
    this.vote_count = vote_count;
}

public void setId(int id) {
    this.id = id;
}

public void setVideo(boolean video) {
    this.video = video;
}

public void setTitle(String title) {
    this.title = title;
}

public void setPopularity(float popularity) {
    this.popularity = popularity;
}

public void setPoster_path(String poster_path) {
    this.poster_path = poster_path;
}

public void setOriginal_language(String original_language) {
    this.original_language = original_language;
}

public void setOriginal_title(String original_title) {
    this.original_title = original_title;
}

public void setGenre_ids(ArrayList<String> genre_ids) {
    this.genre_ids = genre_ids;
}

public void setBackdrop_path(String backdrop_path) {
    this.backdrop_path = backdrop_path;
}

public void setAdult(boolean adult) {
    this.adult = adult;
}

public void setOverview(String overview) {
    this.overview = overview;
}

public void setRelease_date(Date release_date) {
    this.release_date = release_date;
}

public int getVote_count() {
    return vote_count;
}

public int getId() {
    return id;
}

public boolean isVideo() {
    return video;
}

public String getTitle() {
    return title;
}

public float getPopularity() {
    return popularity;
}

public String getPoster_path() {
    return poster_path;
}

public String getOriginal_language() {
    return original_language;
}

public String getOriginal_title() {
    return original_title;
}

public ArrayList<String> getGenre_ids() {
    return genre_ids;
}

public String getBackdrop_path() {
    return backdrop_path;
}

public boolean isAdult() {
    return adult;
}

public String getOverview() {
    return overview;
}

public Date getRelease_date() {
    return release_date;
}

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

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeInt(vote_count);
    parcel.writeInt(id);
    parcel.writeBooleanArray(new boolean[]{video});
    parcel.writeString(title);
    parcel.writeFloat(popularity);
    parcel.writeString(poster_path);
    parcel.writeString(original_language);
    parcel.writeString(original_title);
    parcel.writeStringList(genre_ids);
    parcel.writeString(backdrop_path);
    parcel.writeBooleanArray(new boolean[]{adult});
    parcel.writeString(overview);
    parcel.writeString(String.valueOf(release_date));


  }

当我尝试获取数据并显示在 TextView 中时,没有任何显示表明我可能没有正确传递数据:

public class IndividualMovieActivity extends AppCompatActivity {

private TextView testText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_individual_movie);

    Intent intent = getIntent();
    Movie movie = intent.getParcelableExtra("Movie");
    String title = movie.getOriginal_title();

    testText = findViewById(R.id.movie_name);
    //no text being displayed
    testText.setText(title);

   }
 }

更新 完整的源代码可以在这里找到: https://github.com/troy21688/PopularMovies

最佳答案

您的 Pracelable 实现中存在错误,导致从 Parcel 读取数据时损坏。

你应该使用:

parcel.writeByte(theBoolean ? (byte) 1 : (byte) 0); // replace `theBoolean` with the real variable name

保存 boolean 值(不是writeBooleanArray)。在您的例子中,videoadult

关于java - 不在 Activity 之间传递的 Parcelable 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50827996/

相关文章:

java - 以编程方式向现有 ViewGroup 添加 fragment

android - Parcelable 和继承

java - 即使使用 INNER JOIN FETCH 查询也会出现意外的 JavaAssistLazyInitializer

java - 从 java 主程序启动时,环境变量未被 Tomcat 服务器获取

java - 使用 Java 解析 XML 没有得到任何响应

java - Java中有多少种声明二维数组的方法?

java - 用户单击放大镜菜单项之前的 SearchView.setQuery()

java - 由于图像读取器表面,基于camera2 API的应用程序在某些设备中崩溃

java - Android 接收 null Parcelable 对象

android - 尝试在自定义对象数组上使用 ParcelableArrayList 时发生 ClassCastException