适用于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的最佳方式是什么?我应该使用分部类使它成为类的一部分吗?
我经常忘记匿名内部类(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];
}
}
}