【问题标题】:Parceler error passing a Bundle from one Activity to anotherParceler 错误将 Bundle 从一个 Activity 传递到另一个
【发布时间】:2015-09-13 01:20:20
【问题描述】:

我决定使用 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"));

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

【问题讨论】:

    标签: java android parcelable parceler


    【解决方案1】:

    您只需要将包装对象作为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"));
    

    【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多