web-dev-qa-db-ja.com

アクティビティ間でオブジェクトの配列リストを渡す

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)
15
Darko Petkovski

Songクラスに Parcelable を実装させる必要があります。

10
Ovidiu Latcu

以下を試してみてください

intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
startActivity(intent);

取得する

getIntent().getParcelableArrayListExtra("key");

ユーザー定義オブジェクトの配列リストをIntent Androidに渡す 。 Sajmonによる答えを確認してください

Sajmonのコメントによると、SongクラスはimplementParcelableである必要があります

21
Raghunandan
Intent intent=new Intent(ActivityFrom.this,ActivityTo.class);
intent.putExtra("StringKey",arrayList);
startActivity(intent);

取得する

ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("StringKey");
6
Guru raj
     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

2
Nirmal

この質問 を参照します。この例がお役に立てば幸いです。

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