如何将不可打包的对象从活动传递到另一个活动?

Posted

技术标签:

【中文标题】如何将不可打包的对象从活动传递到另一个活动?【英文标题】:How to pass non parcelable objects to from activity to another activity? 【发布时间】:2016-01-05 21:19:04 【问题描述】:

我有两个对象从两个不同的类实例化,两个类都没有实现 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)

【问题讨论】:

我认为将对象从一个活动传递到另一个类必须实现可打包或可序列化 您能否将您的对象转换为 Json,存储在 Shared Preferences 中,然后使用 Gson 检索? ***.com/questions/5571092/…***.com/questions/14368624/…我已经这样做了几次,但是我不知道它的性能与 Parcelable 和 Serializable 的普通方法相比如何。 如果您可以修改该类,我建议您更改它以实现 Serializable。 【参考方案1】:

如果您的类没有实现 parcelable 或可序列化,并且您无法修改它们(代码可能不在您的控制之下),那么您无法直接在两个活动之间发送数据。

但是,您可以在两个活动之间间接传递数据。您可以将它们存储在单例类中(但是单例很难测试等),您可以从应用程序类中保存和检索它们,或者您可以将它们保存到共享首选项、文件或数据库中,以便由第二个活动加载.

【讨论】:

【参考方案2】:

在没有 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")

【讨论】:

【参考方案3】:

试试这样:

     Bundle bundle=getIntent().getExtras();

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

【讨论】:

【参考方案4】:

你可以这样做:

您的模型类如下所示:

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

希望这会对你有所帮助。

【讨论】:

你读过 OP 问题吗? both classes do not implement parcelable nor serializable OP 是提出这个问题的人,你。 @LetsamrIt @LetsamrIt “OP”的意思是“原创海报”,就是你。

以上是关于如何将不可打包的对象从活动传递到另一个活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上将对象从一个活动传递到另一个活动? [复制]

无法将类的对象从一个活动传递到另一个活动? [复制]

如何将整数从一个活动传递到另一个活动?

在Android中将一个对象从一个活动传递到另一个活动

如何将 LatLng 的数组列表从一个活动传递到另一个活动

我如何将数据从一个活动传递到另一个活动