2016-07-18 2 views
0

У меня возникли проблемы с началом новой деятельности, когда я выразите намерение в ArrayList песен, мой код здесь:Как передать ArrayList и целое число к новой деятельности (Android)

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); 

Песня уже реализует Parcelable.

Когда startActivity работает, Game активность не начинается, вместо этого она переходит к родительской активности без ошибок в журналах.

Я пробовал это без добавления bundle в intent, и начинается правильная работа.

Любая помощь с этим ценится, благодаря

EDIT

я сейчас попробовал с putParcelableArrayListExtra() следующим образом:

if (songs != null) { 
    intent.putParcelableArrayListExtra("DEVICE_SONGS", songs); 

    intent.putExtra("DIFFICULTY", dif); 
    } 

и у меня такая же проблема. Я также не пытаюсь получить доступ к дополнительным функциям в новой деятельности.

EDIT 2

После еще несколько испытаний (на виртуальном устройстве), это на самом деле работает, поэтому я думаю, что это делать с устройством, я использую (OnePlus X с кислородом OS) , Итак, теперь вопрос в том, как заставить его работать на всех устройствах?

+0

Попробуйте с putParcelableArrayListExtra. https://developer.android.com/reference/android/content/Intent.html#putParcelableArrayListExtra(java.lang.String, java.util.ArrayList ) –

+0

@MiguelBenitez Спасибо! Это работает на виртуальном устройстве (но не на моем) – chilliBeanDream

+0

Вы можете попытаться отправить Parcelable Array вместо ArrayList.Проверьте мой ответ –

ответ

0

Существует предел к количеству данных, которое может быть передано Intent, которое здесь превышено. Если я ограничу размер songs, нет проблем

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; 
} 

Имя пакета Приставка!

0

первую очередь вашего класса Song должен реализующего 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"); 
} 
+0

Я уже реализовал Parcelable (он говорит в моем вопросе), это не проблема – chilliBeanDream

0

Вы могли бы попытаться отправить Parcelable массив вместо ArrayList

ArrayList<Parcelable> a =new ArrayList<Parcelable>(); 
Parcelable[] b = new Parcelable[a.size()]; 
a.toArray(b); 
i.putExtra("YOUR_DATA_LIST",b); 
+0

Это тоже работает, но я нашел свою проблему сейчас, спасибо за вашу помощь – chilliBeanDream

Смежные вопросы