适用于Android的Mono,Parcelable&;C#-文档错误

本文关键字:amp C#- 文档 错误 Parcelable Android Mono 适用于 | 更新日期: 2023-09-27 18:21:52

更新:

IParcelable显然目前无法在Android版的Mono中实现。最后,我在类中使用了.NET序列化,然后将序列化的数据打包/绑定到Android特定的代码中,这很好。它还保持类跨平台兼容,这是可取的。

原始问题:

我正试图在Mono for Android应用程序中实现Parcelable作为类的一部分,但Xamarin的Parcelable文档是从Android文档中复制粘贴的:

http://androidapi.xamarin.com/?link=T%3aAndroid.OS.IParcelable

public class MyParcelable implements Parcelable {
 private int mData;
 public int describeContents() {
     return 0;
 }
 public void writeToParcel(Parcel out, int flags) {
     out.writeInt(mData);
 }
 public static final Parcelable.Creator<MyParcelable> CREATOR
         = new Parcelable.Creator<MyParcelable>() {
     public MyParcelable createFromParcel(Parcel in) {
         return new MyParcelable(in);
     }
     public MyParcelable[] newArray(int size) {
         return new MyParcelable[size];
     }
 };
 private MyParcelable(Parcel in) {
     mData = in.readInt();
 }
}

由于该文档是为Java编写的,所以对于C#来说基本上是错误的。我只是想知道是否有人知道如何将这些代码转换成C#。我在CREATOR字段方面遇到了特别的麻烦。

此外,由于我正在尝试编写稍后可以移植到其他平台的代码,实现Parcelable的最佳方式是什么?我应该使用分部类使它成为类的一部分吗?

适用于Android的Mono,Parcelable&;C#-文档错误

我经常忘记匿名内部类(AIC)的一件事是,AIC中的"类型"不是直接翻译成C#的——它们是接口,这意味着C#的标准是以"I"开头此外,每个AIC都必须在c#中明确实现。

以下内容有帮助吗?

public class Creator : IParcelableCreator
{

    public Java.Lang.Object CreateFromParcel(Parcel source)
    {
        throw new NotImplementedException();
    }
    public Java.Lang.Object[] NewArray(int size)
    {
        throw new NotImplementedException();
    }
    public IntPtr Handle
    {
        get { throw new NotImplementedException(); }
    }
}

然后:

public class MyParcelable : IParcelable
{

    public int DescribeContents()
    {
        throw new NotImplementedException();
    }
    public void WriteToParcel(Parcel dest, int flags)
    {
        throw new NotImplementedException();
    }
    public IntPtr Handle
    {
        get { throw new NotImplementedException(); }
    }
}

我知道这是旧的,但我遇到了同样的问题。最后,我使用[ExportField("CREATOR")]使其工作。

所以我最终选择了

public class MyParcelable : Object, IParcelable
{
    public string MyString { get; set; }
    [ExportField("CREATOR")]
    public static MyParcelableCreator InititalizeCreator()
    {
        return new MyParcelableCreator();
    }
    public MyParcelable(string myString)
    {
        MyString = myString;
    }
    public int DescribeContents()
    {
        return 0;
    }
    public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
    {
        dest.WriteString(MyString);
    }
    public class MyParcelableCreator : Object, IParcelableCreator
    {
        public Object CreateFromParcel(Parcel source)
        {
            return new MyParcelable(source.ReadString());
        }
        public Object[] NewArray(int size)
        {
            return new MyParcelable[size];
        }
    }
}

希望这能帮助

从资源中,实现接口

你必须扩展Java.Lang.Object,它避免了你处理或处置。

public class GroupMetadata : Java.Lang.Object, IParcelable, IComparable<GroupMetadata> {
        public const int REFRESH = -1;
        public int flPos;
        public int lastChildFlPos;
        public int gPos;
        public long gId;
        private GroupMetadata ()
        {
        }
        public static GroupMetadata Obtain(int flPos, int lastChildFlPos, int gPos, long gId) {
            GroupMetadata gm = new GroupMetadata();
            gm.flPos = flPos;
            gm.lastChildFlPos = lastChildFlPos;
            gm.gPos = gPos;
            gm.gId = gId;
            return gm;
        }
        public int CompareTo(GroupMetadata another) {
            if (another == null) {
                throw new InvalidOperationException();
            }
            return gPos - another.gPos;
        }
        public int DescribeContents() {
            return 0;
        }
        public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags) {
            dest.WriteInt(flPos);
            dest.WriteInt(lastChildFlPos);
            dest.WriteInt(gPos);
            dest.WriteLong(gId);
        }
        public static class Creator : Java.Lang.Object, IParcelableCreator
        {
            public static Java.Lang.Object CreateFromParcel(Parcel source)
            {
                GroupMetadata gm = GroupMetadata.Obtain(
                    source.ReadInt(),
                    source.ReadInt(),
                    source.ReadInt(),
                    source.ReadLong());
                return gm;
            }
            public static Java.Lang.Object[] NewArray(int size)
            {
                return new GroupMetadata[size];
            }
        }
    }