如何将不可打包的对象从 activity 传递到另一个 activity?
How to pass non parcelable objects to from activity to another activity?
我有两个对象从两个不同的 class 实例化,并且两个 class 都没有实现 parcelable 或 serializable。我想将这些对象传递给
另一个 activity,所以我写了下面的代码:
*代码:
//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.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)
如何将不可打包的对象从 activity 传递到另一个 activity?
你可以这样做:
您的 模型 class 将如下所示:
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");
希望对您有所帮助。
这样试试:
Bundle bundle=getIntent().getExtras();
Header headerModel =(Header)) bundle.getParcelable("HeaderModel");
如果您的 class 没有实现 parcelable 或 serializable,并且您无法修改它们(代码可能不在您的控制之下),那么您无法直接 在两个活动之间发送数据。
但是,您可以在两个活动之间间接传递数据。您可以将它们存储在单例中 class(但是单例很难测试等),您可以将它们保存并从您的应用程序中检索 class,或者您可以将它们保存到 sharedpreferences、文件或由第二个 activity.
加载的数据库
传递没有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")
我有两个对象从两个不同的 class 实例化,并且两个 class 都没有实现 parcelable 或 serializable。我想将这些对象传递给 另一个 activity,所以我写了下面的代码:
*代码:
//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.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)
如何将不可打包的对象从 activity 传递到另一个 activity?
你可以这样做:
您的 模型 class 将如下所示:
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");
希望对您有所帮助。
这样试试:
Bundle bundle=getIntent().getExtras();
Header headerModel =(Header)) bundle.getParcelable("HeaderModel");
如果您的 class 没有实现 parcelable 或 serializable,并且您无法修改它们(代码可能不在您的控制之下),那么您无法直接 在两个活动之间发送数据。
但是,您可以在两个活动之间间接传递数据。您可以将它们存储在单例中 class(但是单例很难测试等),您可以将它们保存并从您的应用程序中检索 class,或者您可以将它们保存到 sharedpreferences、文件或由第二个 activity.
加载的数据库传递没有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")