Mono для Android, Parcelable & C # - неправильная документация - PullRequest
3 голосов
/ 31 января 2012

UPDATE:

IParcelable, по-видимому, в настоящее время не может быть реализовано в Mono для Android . В конце я использовал сериализацию .NET в классе, а затем разложил / связал сериализованные данные в специфичный для Android код, который работает просто отлично. Он также поддерживает кросс-платформенность класса, что желательно.

ОРИГИНАЛЬНЫЙ ВОПРОС:

Я пытаюсь реализовать Parcelable как часть класса в приложении Mono для Android, но документация 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? Должен ли я сделать это частью класса, используя частичные классы?

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Одна вещь, которую я часто забываю с анонимными внутренними классами (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(); }
    }
}
2 голосов
/ 30 октября 2015

Я знаю, что это старый, но я столкнулся с той же проблемой.В конце концов я заработал, используя [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];
        }
    }
}

Надеюсь, это кому-нибудь поможет

0 голосов
/ 14 ноября 2013

Из ресурсов Реализация интерфейсов

Вы должны расширить 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];
            }
        }
    }
...