2016-07-18 5 views
0

Ich habe gebe eine Arraylist von Songs der Absicht, einmal ein Problem passieren, beginnend mit, ist mein Code hier:Wie eine Arraylist und eine ganze Zahl auf eine neue Aktivität (Android) habe ich eine neue Aktivität

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 implementiert bereits Parcelable.

Wenn startActivity ausgeführt wird, startet Game Aktivität nicht, stattdessen geht es bis zur übergeordneten Aktivität ohne Fehler in den Protokollen.

Ich habe dies versucht, ohne bundle zu intent hinzuzufügen, und die richtige Aktivität beginnt.

Jede mögliche Hilfe bei diesem geschätzt wird, dank

EDIT

Ich habe jetzt mit putParcelableArrayListExtra() versucht wie folgt:

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

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

und ich habe das gleiche Problem. Ich versuche auch nicht, auf die Extras der neuen Aktivität zuzugreifen.

EDIT 2

Nach weiteren Tests (auf einem virtuelles Gerät), es tatsächlich funktioniert, so dass ich denke, dass diese mit dem Gerät zu tun ist, ich verwende (OnePlus X mit Sauerstoff OS) . Die Frage ist nun, wie kann ich es auf allen Geräten nutzen?

+0

Versuchen Sie mit PutParcelableArrayListExtra. https://developer.android.com/reference/android/content/Intent.html#putParcelableArrayListExtra(java.lang.String, java.util.ArrayList ) –

+0

@MiguelBenitez Danke! Dies funktioniert auf dem virtuellen Gerät (aber nicht auf meinem) – chilliBeanDream

+0

Sie könnten versuchen, ein Parcelable-Array anstelle einer ArrayList zu senden.Überprüfen Sie meine Antwort –

Antwort

0

Es schickt eine Grenze auf die Menge der Daten, die durch eine Intent übergeben werden kann, die ist hier überschritten werden. Wenn ich die Größe von songs begrenzen, gibt es kein Problem

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

Paketname Präfix!

0

allererst Klasse Lied muss Parcel implementiert, geben Sie dies:

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

Jetzt können Sie bundle.putParcelableArrayListExtra verwenden für Ihre Liste auf eine andere Tätigkeit übergeben.

Für die Arraylist übergeben:

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

Für Abrufen der Arraylist

ArrayList<Song> songs; 
Intent intent = getIntent(); 
Bundle bundle = intent.getExtras(); 
if (bundle != null && bundle.containsKey("song")){ 
    songs = bundle.getParcelableArrayList("songs"); 
} 
+0

Ich habe Parcelable bereits implementiert (es heißt in meiner Frage), das ist nicht das Problem – chilliBeanDream

0

Sie könnten versuchen, eine Parcel Array anstelle eines ArrayList

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

Das funktioniert auch, aber ich habe mein Problem jetzt gefunden, danke für Ihre Hilfe – chilliBeanDream

Verwandte Themen