1

我决定使用 Parceler,因为它看起来像一个很棒的库,而且作者非常支持它。我正在使用 Parceler 包装一个对象并将其传递给 Bundle 中的另一个 Activity。当我尝试打开对象时出现错误:android.os.Bundle cannot be cast to org.parceler.ParcelWrapper

我的 FirstActivity 代码:

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

我的 SecondActivity 代码:

User user = Parcels.unwrap(this.getIntent().getParcelableExtra("User"));

我怀疑这只是一个新手错误。任何建设性的帮助表示赞赏!

4

2 回答 2

5

您只需要将包装的对象作为参数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"));
于 2015-09-13T01:40:27.690 回答
1

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)

在第二个活动中,您将在其中获取数据,您可以按如下方式进行:

val user: User = Parcels.unwrap(data?.getParcelableExtra("User"))

注意:使用此库时,您需要使用Parcels.wrapParcels.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
        }
    }

其次,创建具有必要属性的数据类用户:

@Parcelize
data class User(
  val userId: Int,
  val name: String,
  // more properties
) : Parcelable
于 2019-09-13T19:28:41.670 回答