Parceler 错误将 Bundle 从一个 Activity 传递到另一个
Parceler error passing a Bundle from one Activity to another
我决定使用 Parceler,因为它看起来是一个很棒的库,并且得到了作者的大力支持。我正在使用 Parceler 包装一个对象并将其传递给 Bundle 中的另一个 Activity。当我尝试打开对象时出现错误:android.os.Bundle cannot be cast to org.parceler.ParcelWrapper
我的第一个Activity代码:
User user = responseData.getUser();
Bundle bundle = new Bundle();
bundle.putParcelable("User", Parcels.wrap(user));
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("User", bundle);
startActivity(intent);
我的第二个Activity代码:
User user = Parcels.unwrap(this.getIntent().getParcelableExtra("User"));
我怀疑这只是新手犯的错误。感谢任何建设性的帮助!
您只需要将包装对象作为 putExtra
的参数,而不是 Bundle
。这是解决方案:
User user = responseData.getUser();
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("User", Parcels.wrap(user));
startActivity(intent);
在 SecondActivity 上,在其 onCreate() 方法中执行:
User user = (User) Parcels.unwrap(getIntent().getParcelableExtra("User"));
在kotlin中可以按如下方式进行:
val user = responseData.getUser()
val bundle = Bundle()
bundle.putParcelable("User", Parcels.wrap(user))
val intent = Intent(this@FirstActivity, SecondActivity::class.java)
intent.putExtra("User", bundle)
startActivity(intent)
在第二个 activity 中,您可以按以下方式获取数据:
val user: User = Parcels.unwrap(data?.getParcelableExtra("User"))
注意:使用这个库时你需要使用Parcels.wrap
和Parcels.unwrap
不过,如果您使用 Kotlin
,我建议您使用 @Parcelize
注释,因为它的实现非常简单,而且您的代码非常干净。
如果你想实现@Parcelize
你可以按如下方式进行:
首先,在您的 build.gradle 文件中添加以下内容:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
// ... other codes
// Add this code
androidExtensions {
experimental = true
}
}
其次,创建数据 class 具有必要属性的用户:
@Parcelize
data class User(
val userId: Int,
val name: String,
// more properties
) : Parcelable
我决定使用 Parceler,因为它看起来是一个很棒的库,并且得到了作者的大力支持。我正在使用 Parceler 包装一个对象并将其传递给 Bundle 中的另一个 Activity。当我尝试打开对象时出现错误:android.os.Bundle cannot be cast to org.parceler.ParcelWrapper
我的第一个Activity代码:
User user = responseData.getUser();
Bundle bundle = new Bundle();
bundle.putParcelable("User", Parcels.wrap(user));
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("User", bundle);
startActivity(intent);
我的第二个Activity代码:
User user = Parcels.unwrap(this.getIntent().getParcelableExtra("User"));
我怀疑这只是新手犯的错误。感谢任何建设性的帮助!
您只需要将包装对象作为 putExtra
的参数,而不是 Bundle
。这是解决方案:
User user = responseData.getUser();
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("User", Parcels.wrap(user));
startActivity(intent);
在 SecondActivity 上,在其 onCreate() 方法中执行:
User user = (User) Parcels.unwrap(getIntent().getParcelableExtra("User"));
在kotlin中可以按如下方式进行:
val user = responseData.getUser()
val bundle = Bundle()
bundle.putParcelable("User", Parcels.wrap(user))
val intent = Intent(this@FirstActivity, SecondActivity::class.java)
intent.putExtra("User", bundle)
startActivity(intent)
在第二个 activity 中,您可以按以下方式获取数据:
val user: User = Parcels.unwrap(data?.getParcelableExtra("User"))
注意:使用这个库时你需要使用Parcels.wrap
和Parcels.unwrap
不过,如果您使用 Kotlin
,我建议您使用 @Parcelize
注释,因为它的实现非常简单,而且您的代码非常干净。
如果你想实现@Parcelize
你可以按如下方式进行:
首先,在您的 build.gradle 文件中添加以下内容:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
// ... other codes
// Add this code
androidExtensions {
experimental = true
}
}
其次,创建数据 class 具有必要属性的用户:
@Parcelize
data class User(
val userId: Int,
val name: String,
// more properties
) : Parcelable