2つのアクティビティ間でオブジェクトの配列リストを渡そうとしていますが、2番目のアクティビティでアプリがクラッシュします。誰かがこの問題を解決するのを手伝ってくれますか...
これが私の最初のアクティビティからの私のコードです:
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelableArrayList("songs",(ArrayList<? extends Parcelable>) albumsArray.get(position).getSongs());
Log.v("--", "OK");
i.putExtras(b);
i.setClass(LatestAlbums.this, AlbumDetails.class);
startActivity(i);
2番目のアクティビティのコード:
songs=new ArrayList<Songs>();
Bundle b = this.getIntent().getExtras();
if(b!=null)
songs = b.getParcelable("songs");
Log.v("--", songs.size()+"");
そして、私のlogcatの出力:
04-03 16:37:03.513: E/AndroidRuntime(6576): FATAL EXCEPTION: main
04-03 16:37:03.513: E/AndroidRuntime(6576): Java.lang.RuntimeException: Parcel: unable to marshal value com.musicapp.objects.Songs@419489e8
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Parcel.writeValue(Parcel.Java:1137)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Parcel.writeList(Parcel.Java:524)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Parcel.writeValue(Parcel.Java:1097)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Parcel.writeMapInternal(Parcel.Java:493)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Bundle.writeToParcel(Bundle.Java:1612)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Parcel.writeBundle(Parcel.Java:507)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.content.Intent.writeToParcel(Intent.Java:6147)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.Java:1613)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1379)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.app.Activity.startActivityFromChild(Activity.Java:3458)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.app.Activity.startActivityForResult(Activity.Java:3210)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:817)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.app.Activity.startActivity(Activity.Java:3297)
04-03 16:37:03.513: E/AndroidRuntime(6576): at com.outsourcefarm.musicagratis.activities.LatestAlbums$4$1.onItemClick(LatestAlbums.Java:232)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.widget.AdapterView.performItemClick(AdapterView.Java:292)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.widget.AbsListView.performItemClick(AbsListView.Java:1058)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:2514)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.widget.AbsListView$1.run(AbsListView.Java:3168)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Handler.handleCallback(Handler.Java:605)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Handler.dispatchMessage(Handler.Java:92)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.os.Looper.loop(Looper.Java:137)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Android.app.ActivityThread.main(ActivityThread.Java:4440)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Java.lang.reflect.Method.invokeNative(Native Method)
04-03 16:37:03.513: E/AndroidRuntime(6576): at Java.lang.reflect.Method.invoke(Method.Java:511)
04-03 16:37:03.513: E/AndroidRuntime(6576): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:787)
04-03 16:37:03.513: E/AndroidRuntime(6576): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:554)
04-03 16:37:03.513: E/AndroidRuntime(6576): at dalvik.system.NativeStart.main(Native Method)
Song
クラスに Parcelable
を実装させる必要があります。
以下を試してみてください
intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
startActivity(intent);
取得する
getIntent().getParcelableArrayListExtra("key");
ユーザー定義オブジェクトの配列リストをIntent Androidに渡す 。 Sajmonによる答えを確認してください
Sajmonのコメントによると、Song
クラスはimplement
Parcelable
である必要があります
Intent intent=new Intent(ActivityFrom.this,ActivityTo.class);
intent.putExtra("StringKey",arrayList);
startActivity(intent);
取得する
ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("StringKey");
i.setClass(LatestAlbums.this, AlbumDetails.class);
i.putStringArrayListExtra("list", your song list);
startActivity(i);
アクティビティで配列リストを取得します。
ArrayList<String> fetchList= new ArrayList<String>();
fetchList= getIntent().getStringArrayListExtra("list");
これがあなたのお役に立てば幸いです。
詳細については、これを使用してください link 。
この質問 を参照します。この例がお役に立てば幸いです。
1。 SongクラスはParcelable Classを実装する必要があります
public class Song implements Parcelable {
//Your setter and getter methods
}
2。配列リストをputParcelableArrayListExtra()に配置します
public class ActivityA extends AppCompatActivity {
ArrayList<Song> songs;
@Override
protected void onCreate(Bundle savedInstanceState) {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext(), ActivityB.class)
.putParcelableArrayListExtra("songs", (ArrayList<? extends Parcelable>) songs));
}
});
}
3。 ActivityB
public class ActivityB extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Intent intent = getIntent();
final ArrayList<Song> songs = intent.getParcelableArrayListExtra("songs");
//Check the value in the console
buttonCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (Song value : songs) {
System.out.println(value.getTitle());
}
}
});
}