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
相关产品推荐
相关产品推荐

