![](/img/trans.png)
[英]Unable to pass intent extras from Activity to fragment inside Viewpager
[英]Unable to pass array of objects via intent extras
我正在通過意圖將電影對象的ArrayList從MainActivity
傳遞給DetailActivity
。
intent.putExtra(KEY_mFavoriteMovies, mFavoriteMovies);
startActivity(intent);
在此其他活動中,我將添加其他電影對象。
mFavoriteMovies(movie);
但是, MainActivity
中的mFavoriteMovies
似乎不包含其他影片對象。
這是預期的行為嗎?
方法取決於什么是電影列表...
putStringArrayListExtra
和getStringArrayListExtra
。 putParcelableArrayListExtra
並使用putParcelableArrayListExtra
和getParcelableArrayList
。 如果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
當你即將startActivity
去DetailActivity
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.