You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2022 Xamarin中Android API33下Bundle.GetParcelable过时问题求解

解决Xamarin Android中Bundle.GetParcelable过时问题

在API 33及以上版本中,Bundle.GetParcelable(string?)已被标记为过时,替代方案是使用带类型参数的重载方法Bundle.GetParcelable(string, Class)。针对你的C#自定义User类,按以下步骤修改即可:

1. 修改接收端代码

将原来的接收逻辑替换为带类型参数的重载,传入User类对应的Java类型对象:

User MyUser = new User("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "");
// 替换过时的GetParcelable调用
MyUser = bundlee.GetParcelable("MyUser", Java.Lang.Class.FromType(typeof(User))) as User;

这里Java.Lang.Class.FromType(typeof(User))的作用是将C#的User类型转换为Android系统识别的Java类对象,作为类型校验参数传入。

2. 确保User类正确实现IParcelable接口

要在Bundle中传递自定义对象,User类必须实现Xamarin的IParcelable接口,并且正确实现相关方法和Creator。如果你的User类还没实现,参考以下示例结构:

[Parcelable]
public class User : Java.Lang.Object, IParcelable
{
    // 你的User类字段
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    // ... 其他字段

    // 空构造函数(必须)
    public User() { }

    // 从Parcel读取数据的构造函数
    protected User(Parcel parcel)
    {
        // 按写入顺序读取字段
        Field1 = parcel.ReadString();
        Field2 = parcel.ReadString();
        // ... 读取其他字段
    }

    // 实现IParcelable的WriteToParcel方法
    public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
    {
        // 按顺序写入字段
        dest.WriteString(Field1);
        dest.WriteString(Field2);
        // ... 写入其他字段
    }

    // 实现IParcelable的DescribeContents方法
    public int DescribeContents()
    {
        return 0;
    }

    // 必须定义Creator静态字段
    [ExportField("CREATOR")]
    public static UserCreator Creator()
    {
        return new UserCreator();
    }

    // 实现Parcelable.Creator接口
    public class UserCreator : Java.Lang.Object, IParcelableCreator
    {
        public Java.Lang.Object CreateFromParcel(Parcel source)
        {
            return new User(source);
        }

        public Java.Lang.Object[] NewArray(int size)
        {
            return new User[size];
        }
    }
}

注意:

  • 类上方必须添加[Parcelable]特性,Xamarin会自动处理相关绑定
  • 构造函数、WriteToParcel、Creator的实现必须严格对应,字段的读写顺序要一致
  • 确保所有需要传递的字段都被正确写入和读取

3. 发送端代码无需修改

你当前的发送代码bundlee.PutParcelable("MyUser", MyUser)在API 33中并未过时,可以继续使用,不需要调整。

这样修改后,既能消除过时警告,又能适配未来的Android版本,同时保持在旧版本设备上的兼容性。

内容的提问来源于stack exchange,提问作者Prescott Chartier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:50:37