Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
适用于Android、Parcelable和;C#-文档错误_C#_Android_Mono_Parcelable - Fatal编程技术网

适用于Android、Parcelable和;C#-文档错误

适用于Android、Parcelable和;C#-文档错误,c#,android,mono,parcelable,C#,Android,Mono,Parcelable,更新: 很明显,我是可以接受的。最后,我在类中使用了.NET序列化,然后将序列化数据打包/捆绑到特定于Android的代码中,效果很好。它还保持类跨平台兼容,这是可取的 原始问题: 我试图在Mono for Android应用程序中将Parcelable作为类的一部分实现,但Xamarin的Parcelable文档是从Android文档复制粘贴的: 公共类MyParcelable实现了Parcelable{ 私有int mData; 公共int描述内容(){ 返回0; } 公共无效写入包(包出

更新:

很明显,我是可以接受的。最后,我在类中使用了.NET序列化,然后将序列化数据打包/捆绑到特定于Android的代码中,效果很好。它还保持类跨平台兼容,这是可取的

原始问题:

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

公共类MyParcelable实现了Parcelable{
私有int mData;
公共int描述内容(){
返回0;
}
公共无效写入包(包出,内部标志){
out.writeInt(mData);
}
公共静态最终包裹。创建者
=新的Parcelable.Creator(){
公共MyParcelable createFromParcel(中的地块){
返回新的MyParcelable(在中);
}
公共MyParcelable[]新数组(整数大小){
返回新的MyParcelable[大小];
}
};
私人MyParcelable(包裹内){
mData=in.readInt();
}
}
因为该文档是为Java编写的,所以C#基本上是错误的。我只是想知道是否有人知道如何将这段代码转换成C。我在CREATOR字段方面特别有问题


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

对于匿名内部类(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(); }
    }
}
从资源上看,

您必须扩展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];
            }
        }
    }
公共类GroupMetadata:Java.Lang.Object、iParceable、IComparable{
public const int REFRESH=-1;
国际公共图书馆;
公共国际儿童基金会;
公共国际GPO;
公共长gId;
私有组元数据()
{
}
获取公共静态组元数据(int-flPos、int-lastChildFlPos、int-gpo、long-gId){
GroupMetadata gm=新的GroupMetadata();
gm.flPos=flPos;
gm.lastChildFlPos=lastChildFlPos;
gm.gPos=gPos;
gm.gId=gId;
返回gm;
}
public int CompareTo(组元数据另一个){
如果(另一个==null){
抛出新的InvalidOperationException();
}
返回gPos-other.gPos;
}
公共int描述内容(){
返回0;
}
公共无效写入包裹(包裹目的地、包裹写入标记){
目的地记录(flPos);
目的地写入(最后一个子女FLPOS);
目的地记录(GPO);
目的地记录(gId);
}
公共静态类创建者:Java.Lang.Object,IParcelableCreator
{
公共静态Java.Lang.Object CreateFromParcel(地块源)
{
GroupMetadata gm=GroupMetadata.get(
source.ReadInt(),
source.ReadInt(),
source.ReadInt(),
source.ReadLong());
返回gm;
}
公共静态Java.Lang.Object[]NewArray(整型大小)
{
返回新的GroupMetadata[size];
}
}
}

我知道这是一个老问题,但我遇到了同样的问题。最后,我使用[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];
        }
    }
}

希望这对某人有所帮助

尽管我不得不承认我又看了一遍——我绝对不喜欢一个类让我实现“IntPtr Handle”——我相信这是mono for Android的一个缺陷。通常我会不惜一切代价避免这种事情。我宁愿在活动/意图的另一端重新创建对象,也不愿在它们之间传递对象。谢谢!那里的所有代码都等同于文档中的Java代码吗?我看不到Creator类在MyParcelable类中的使用位置。因为我对Java了解不多,所以我不知道“public static final Parcelable.Creator”代表什么,也不知道它在您发布的代码中的反映。Creator类(我的代码)返回Java.Lang.Objects。不幸的是,我的开发机器今天死机了,所以我无法进行测试,但您也必须这样做:1。将实例转换为Java.Lang.Object——我不知道具体细节。2.看看是否可以在不影响任何内容的情况下更改类型(Java.Lang.Object为您的特定类型)。一旦你解决了Creator类的类型问题——我不认为这会很忙——那么在MyPaceAble中创建一个Creator的公共静态实例。代码的其余部分应该是翻译。对不起,我帮不了什么忙:(你确定吗?在Mono For Android上,它明确指出无法实现IParcelable。好吧,最后我只是将.NET序列化用于XML,然后将结果打包到Android中。我读到标准Android序列化不可用,但后来我意识到这是指Java,而.NET工作正常。Also、 使用.NET序列化可以保持此类跨平台兼容,因此最终我是否可以实现IParcelable是一个没有意义的问题。不管怎样,问题是“有人可以将代码翻译成Java吗?”这一点已经得到了回答。如果IParcelable的文档中提到了该限制,那就太好了。
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];
        }
    }
}