【问题标题】:Unable to pass array of objects via intent extras无法通过 Intent Extras 传递对象数组
【发布时间】:2017-07-25 23:00:06
【问题描述】:

我通过意图将电影对象的 ArrayList 从 MainActivity 传递到 DetailActivity

intent.putExtra(KEY_mFavoriteMovies, mFavoriteMovies);
startActivity(intent);

在这个其他活动中,我正在添加其他电影对象。

mFavoriteMovies(movie);

但是,MainActivity 中的mFavoriteMovies 似乎不包含其他电影对象。

这是预期的行为吗?

【问题讨论】:

  • 你不能简单地传递对象,你需要让你的对象类实现 Parcelable,然后如果你传递一个对象,使用 putExtra,如果你传递数组,使用 putParcelableArrayListExtra
  • @the_prole - 您是否有机会检查我的解决方案(电影名称为字符串或对象/类)?如果它有效,那么请接受答案并投票。谢谢!
  • @JRG 你没有真正回答这个问题。我通过一个意图传递一个数组列表。答案是否定的,数组列表不是相同的对象。传递的数组列表是从一个包裹重建的,是一个全新的对象。不过感谢您的尝试。

标签: java android android-intent android-activity parcelable


【解决方案1】:

这是预期的行为,因为当您在 DetailActivity 修改数组列表时,您正在使用电影列表的不同实例。

您可以通过以startActivityForResult 开头的DetailActivity 获取对列表所做的更改,然后将更新后的列表发送回您的MainActivity

你的MainActivity会有类似的东西

ArrayList<String> mMovies;
int DETAIL_REQUEST_CODE = 123;
String KEY_FAVORITE_MOVIES = "key-movies";

private void startDetailActivity() {
    Intent intent = new Intent(this, DetailActivity.class);
    intent.putStringArrayListExtra(KEY_FAVORITE_MOVIES, mMovies);
    startActivityForResult(intent, DETAIL_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == DETAIL_REQUEST_CODE && resultCode == RESULT_OK) {
        mMovies = data.getStringArrayListExtra(KEY_FAVORITE_MOVIES);
    }
}

您必须从DetailActivity 发送更新后的列表,内容如下:

public void finishDetail() {
    Intent resultIntent = new Intent();
    resultIntent.putStringArrayListExtra(KEY_FAVORITE_MOVIES, mMovies);
    setResult(Activity.RESULT_OK, resultIntent);
    finish();
}

【讨论】:

    【解决方案2】:

    除了@JRG 答案之外,为了获得MainActivity 中的更新列表,您需要将DetailActivity 启动为startActivityForResult。这将为您提供一个选项,通过 onActivityResult 回调使用 setResult 将更新后的数组从 DetailsActivity 返回到 MainActivity

    另一种方法是通过将视图部分(活动)与模型(最喜欢的电影)分开来更改应用程序的架构来修复它。

    【讨论】:

      【解决方案3】:

      方法取决于什么是电影列表...

      • 如果您的电影列表是一个简单的字符串数组列表,则使用 putStringArrayListExtragetStringArrayListExtra
      • 如果它们是对象(单独的类),那么您应该实现 可打包并使用putParcelableArrayListExtragetParcelableArrayList

      如果 MovieName 是一个对象/类,则实现 Parcelable

      import android.os.Parcel;
      import android.os.Parcelable;
      
      public class MovieName implements Parcelable {
      
          private String name;
      
          private String year;
      
          public MovieName(String name, String year) {
              this.name = name;
              this.year = year;
          }
      
          public MovieName(Parcel in) {
              name = in.readString();
              year = in.readString();
          }
      
          // Creator
          public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
              public MovieName createFromParcel(Parcel in) {
                  return new MovieName(in);
              }
      
              public MovieName[] newArray(int size) {
                  return new MovieName[size];
              }
          };
      
          @Override
          public int describeContents() {
              return 0;
          }
      
          @Override
          public void writeToParcel(Parcel parcel, int i) {
              parcel.writeString(name);
              parcel.writeString(year);
          }
      
          @Override
          public String toString() {
              return "MovieName=[name=" + name + ";year=" + year + "]";
          }
      }
      

      MainActivity里面当你要到startActivityDetailActivity

      Intent intent = new Intent(view.getContext(), DetailActivity.class);
      
      ArrayList<String> movieNames = new ArrayList<String>();
      movieNames.add("Star Wars");
      movieNames.add("Transporter");
      movieNames.add("Need for Speed");
      intent.putStringArrayListExtra("MOVIE_NAMES", movieNames);
      Log.d("Movie Names", "Writing into intent ... " + movieNames.toString());
      
      ArrayList<MovieName> movieNameList = new ArrayList<MovieName>();
      movieNameList.add(new MovieName("Star Wars", "1900"));
      movieNameList.add(new MovieName("Transporter", "2000"));
      intent.putParcelableArrayListExtra("movie", movieNameList);
      Log.d("MovieName Parcelable", "Writing into intent ... " + movieNameList.toString());
      
      startActivity(intent);
      

      内部DetailActivity's onCreate

      ArrayList<String> movieNames = getIntent().getStringArrayListExtra("MOVIE_NAMES");
      Log.d("Movie Names", "Reading from intent ... " + movieNames.toString());
      
      ArrayList<MovieName> movieNameList = getIntent().getExtras().getParcelableArrayList("movie");
      Log.d("MovieName Parcelable", "Reading from intent ... " + movieNameList.toString());
      

      样品运行

      07-25 16:32:53.108 5264-5264/? D/Movie Names: Writing into intent ... [Star Wars, Transporter, Need for Speed]
      07-25 16:32:53.111 5264-5264/? D/MovieName Parcelable: Writing into intent ... [MovieName=[name=Star Wars;year=1900], MovieName=[name=Transporter;year=2000]]
      
      07-25 16:32:53.144 5264-5264/? D/Movie Names: Reading from intent ... [Star Wars, Transporter, Need for Speed]
      07-25 16:32:53.145 5264-5264/? D/MovieName Parcelable: Reading from intent ... [MovieName=[name=Star Wars;year=1900], MovieName=[name=Transporter;year=2000]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2018-12-30
        相关资源
        最近更新 更多