簡體   English   中英

如何將非parcelable對象從活動傳遞到另一個活動?

[英]How to pass non parcelable objects to from activity to another activity?

我有兩個對象從兩個不同的類實例化,這兩個類不實現parcelable或serializable。 我想將這些對象傳遞給另一個活動,所以我寫了下面的代碼:

*代碼

 //send object
 Intent intConnect = new Intent(mCtx.getApplicationContext(), ActConnect.class);
            Bundle bndConnect = new Bundle();
            bndConnect.putParcelable("HeaderModel", (Parcelable) mHeaderModel);
            bndConnect.putParcelable("DetailsModel", (Parcelable) mDetailsModel);
            intConnect.putExtras(bndConnect);
            intConnect.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mCtx.startActivity(intConnect);

//receive objects in the receiving activity
 Bundle extras = getIntent().getExtras();
    Header headerModel = (Header) extras.get("HeaderModel");
    Details detailsModel = (Details) extras.get("DetailsModel");

但在運行時,我收到以下logcat:

logcat

10-08 11:55:44.225  13138-13138/com.example.com.bt_11 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.com.bt_11, PID: 13138
java.lang.ClassCastException: com.example.com.adapter.Header cannot be cast to android.os.Parcelable
        at com.example.com.adapter.MyExpandableList$1.onClick(MyExpandableList.java:152)
        at android.view.View.performClick(View.java:5184)
        at android.view.View$PerformClick.run(View.java:20893)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)

如何將非parcelable對象從活動傳遞到另一個活動?

如果您的類沒有實現parcelable或serializable,並且您無法修改它們(代碼可能不在您的控制之下),那么您無法直接在兩個活動之間發送數據。

但是,您可以在兩個活動之間間接傳遞數據。 您可以將它們存儲在單個類中(但是單例很難測試等),您可以將它們保存並從應用程序類中檢索它們,或者您可以將它們保存到共享引用,文件或數據庫以由第二個活動加載。

試試這樣:

     Bundle bundle=getIntent().getExtras();

    Header headerModel =(Header)) bundle.getParcelable("HeaderModel");

傳遞沒有parcelable或serializable的對象的最好方法是使用Gson Lib

並使用此擴展:

fun Intent.putObject(name: String, value: Any) {
    val jsonValue = Gson().toJson(value)
    this.putExtra(name, jsonValue)
}

inline fun <reified T : Any> Intent.getObjectExtra(name: String): T? {
    val json = this.getStringExtra(name)

    val obj = Gson().fromJson<T>(json, T::class.java)
    return (obj as T)
}

inline fun <reified T : Any> Bundle.getObject(name: String): T? {
    val json = this.getString(name)

    val obj = Gson().fromJson<T>(json, T::class.java)
    return (obj as T)
}

使用:

val intent = Intent(this,YourActivity::class.java)
intent.putObject(name = "myKey", value = MyObject)

//To get the object in the other activity
val product = intent.extras?.getObject<MyObject>(name = "myKey")
// or
val product = intent.getObjectExtra<MyObject>(name = "myKey")

你可以這樣做:

您的Model類如下所示:

public class ModelClass implements Serializable{

  // Other stuff

}

如何通過:

Intent mIntent = new Intent(mContext, NextActivity.class);
mIntent.putExtra("HeaderModel", mHeaderModel);
startActivity(mIntent);

如何獲得:

Header headerModel = (Header) getIntent.getSerializableExtra("HeaderModel");

希望這會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM