簡體   English   中英

無法通過意圖附加傳遞對象數組

[英]Unable to pass array of objects via intent extras

我正在通過意圖將電影對象的ArrayList從MainActivity傳遞給DetailActivity

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

在此其他活動中,我將添加其他電影對象。

mFavoriteMovies(movie);

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

這是預期的行為嗎?

方法取決於什么是電影列表...

  • 如果您的電影列表是一個簡單的StringArrayList,則使用putStringArrayListExtragetStringArrayListExtra
  • 如果它們是Object(單獨的類),則應實現putParcelableArrayListExtra並使用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]]

除了@JRG答案之外,為了在MainActivity獲取更新列表,您還需要以startActivityForResult啟動DetailActivity 這將為您提供一個選項,可通過onActivityResult回調從使用setResult DetailsActivity返回更新的數組到MainActivity

另一種方法是通過將視圖部分(活動)與模型(喜歡的電影)分開來更改應用程序的體系結構來修復它。

這是預期的行為,因為當您在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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM