如何实现同一Activity的两个Intent向目标Activity复用历史Extra数据?
解决音乐播放App的Intent数据复用问题
嘿,我来帮你搞定这个困扰你两天的问题!核心问题很明确:你点击ImageView发起的第二个Intent没有携带之前列表项点击时传递的数据,所以我们只需要在ArtistsListActivity里把第一次(或最后一次)点击列表项的内容存起来,第二次跳转时直接复用这些数据就行。
具体步骤如下:
在ArtistsListActivity中添加全局变量保存历史数据
在你的ArtistsListActivity类里声明两个全局变量,用来存储最后一次选中的艺术家信息和ID:// 放在ArtistsListActivity类的最上方,作为成员变量 private CListItems lastSelectedArtist; private String lastSelectedId;修改第一个Intent的代码,保存选中数据
当用户点击列表项时,除了传递数据给PlayNowActivity,还要把数据同步保存到刚才声明的全局变量里:artistList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 先保存当前选中的数据到全局变量 lastSelectedArtist = artistsNames.get(position); lastSelectedId = String.valueOf(id); Intent goToPlayNowIntent = new Intent(ArtistsListActivity.this, PlayNowActivity.class); goToPlayNowIntent.putExtra("ITEMDATE", lastSelectedArtist); goToPlayNowIntent.putExtra("ID", lastSelectedId); startActivity(goToPlayNowIntent); } });修改第二个Intent的代码,复用历史数据
点击ImageView时,先检查是否有保存的历史数据,如果有就把数据添加到Intent里,没有就直接启动Activity:final ImageView nowPlaying = (ImageView) findViewById(R.id.now_playing); nowPlaying.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent nowPlayingIntent = new Intent(ArtistsListActivity.this, PlayNowActivity.class); // 如果之前有选中过列表项,就把保存的数据传递过去 if (lastSelectedArtist != null) { nowPlayingIntent.putExtra("ITEMDATE", lastSelectedArtist); nowPlayingIntent.putExtra("ID", lastSelectedId); } startActivity(nowPlayingIntent); } });确保CListItems实现Parcelable接口
因为你用了getParcelableExtra来传递CListItems对象,这个类必须实现Parcelable接口才能正常传递,如果你还没实现的话,参考下面的示例代码(根据你的实际字段调整):public class CListItems implements Parcelable { private String header; private String log; private int thump; // 你的构造方法、getter和setter方法 // Parcelable相关实现 protected CListItems(Parcel in) { header = in.readString(); log = in.readString(); thump = in.readInt(); } public static final Creator<CListItems> CREATOR = new Creator<CListItems>() { @Override public CListItems createFromParcel(Parcel in) { return new CListItems(in); } @Override public CListItems[] newArray(int size) { return new CListItems[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(header); dest.writeString(log); dest.writeInt(thump); } }
效果说明
这样修改后:
- 用户第一次点击列表项时,数据会被保存,同时正常传递给PlayNowActivity显示;
- 之后点击ImageView,会自动把最后一次选中的列表项数据传递过去,和点击列表项的效果完全一致;
- 如果用户还没点击过列表项就点ImageView,Intent里没有Extra数据,PlayNowActivity就会显示你设置的默认内容("no artist selected"等)。
内容的提问来源于stack exchange,提问作者Osama Rasheed
相关产品推荐
相关产品推荐

