一旦我给了意图一个歌曲的ArrayList,我在开始一个新活动时遇到了问题,我的代码在这里:
ArrayList<Song> songs = new ArrayList<>();
songs.add(new Song("title", "artist"));
Intent intent = new Intent(this, Game.class);
int dif = 0;
Bundle bundle = new Bundle();
if (songs != null) {
bundle.putParcelableArrayList("DEVICE_SONGS", songs);
bundle.putInt("DIFFICULTY", dif);
intent.putExtras(bundle);
}
startActivity(intent);
Song已经实现了Parcelable。
当startActivity
运行时,Game
活动无法启动,相反,它会转到父活动而日志中没有错误。
我在尝试此操作时未向bundle
添加intent
,并开始正确的活动。
感谢您的任何帮助,谢谢
修改
我现在尝试使用putParcelableArrayListExtra()
,如下所示:
if (songs != null) {
intent.putParcelableArrayListExtra("DEVICE_SONGS", songs);
intent.putExtra("DIFFICULTY", dif);
}
我有同样的问题。我也没有尝试访问新活动的额外内容。
编辑2
经过一些更多的测试(在虚拟设备上),它确实有效,所以我认为这与我使用的设备(Oneplus X with Oxygen OS)有关。所以现在的问题是,如何让它在所有设备上运行?
答案 0 :(得分:0)
/**
* Add extended data to the intent. The name must include a package
* prefix, for example the app com.android.contacts would use names
* like "com.android.contacts.ShowAll".
*
* @param name The name of the extra data, with package prefix.
* @param value The ArrayList<Parcelable> data value.
*
* @return Returns the same Intent object, for chaining multiple calls
* into a single statement.
*
* @see #putExtras
* @see #removeExtra
* @see #getParcelableArrayListExtra(String)
*/
public Intent putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putParcelableArrayList(name, value);
return this;
}
包名称前缀!
答案 1 :(得分:0)
首先你的班级必须实现Parcelable,输入:
public class MyClass implements Parcelable {
public final int num1;
public final int num2;
public MyClass(final int num1, final int num2) {
this.num1 = num1;
this.num2 = num2;
}
public static final Creator<MyClass> CREATOR = new Creator<MyClass>() {
public MyClass createFromParcel(Parcel in) {
return new MyClass(in);
}
public MyClass[] newArray(int size) {
return new MyClass[size];
}
};
public vonum1 writeToParcel(Parcel dest, int flags) {
dest.writeInt(num1);
dest.writeInt(num2);
}
private MyClass(Parcel in) {
num1 = in.readInt();
num2 = in.readInt();
}
}
现在您可以使用bundle.putParcelableArrayListExtra将列表传递给另一个活动。
传递ArrayList:
ArrayList<Song> songs = new ArrayList<>();
songs.add(new Song("title", "artist"));
Intent intent = new Intent(this, Game.class);
bundle = new Bundle();
bundle.putParcelableArrayList("song", songs);
intent.putExtras(bundle);
用于检索ArrayList
ArrayList<Song> songs;
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
if (bundle != null && bundle.containsKey("song")){
songs = bundle.getParcelableArrayList("songs");
}
答案 2 :(得分:0)
您可以尝试发送Parcelable数组而不是ArrayList
ArrayList<Parcelable> a =new ArrayList<Parcelable>();
Parcelable[] b = new Parcelable[a.size()];
a.toArray(b);
i.putExtra("YOUR_DATA_LIST",b);
答案 3 :(得分:0)
Intent
可传递的数据量有限制,此处超出了此数量。如果我限制songs
的大小,则没有问题