如何将ArrayList和整数传递给新活动(Android)

时间:2016-07-18 10:07:04

标签: android android-intent android-activity

一旦我给了意图一个歌曲的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)有关。所以现在的问题是,如何让它在所有设备上运行?

4 个答案:

答案 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的大小,则没有问题