C #, напишите конструктор класса из абстрактного базового класса «Parcelable», который из библиотеки Android - PullRequest
0 голосов
/ 03 июня 2019

В C # мне нужно написать конструктор класса, как показано ниже, который расширяет базовый класс из библиотеки Android, т.е. "Parcelable".Я получаю сообщение об ошибке «Parcelable» не содержит конструктор, который принимает 0 аргументов.

Я видел C # Ошибка: Parent не содержит конструктор, который принимает 0 аргументов и Parentне содержит конструктор, который принимает 0 аргументов , но он не работает.Мой класс выглядит следующим образом:

...
using Parcel = Android.OS.Parcel;
using Parcelable = Android.OS.Parcelable;

/// <summary>
/// Created by hashmi on 07/07/2015.
/// </summary>
public class Classname: Parcelable
{
    private int id;
    private string name;
    private string address;
    private string latitude;
    private string longitude;

    public Classname(int id, string name, string address, string latitude, string longitude) 
    {
        this.id = id;
        this.name = name;
        this.address = address;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    ...
}

Код для базового класса Parcelable выглядит следующим образом:

using System;
using Android.Runtime;
using Java.Lang;

namespace Android.OS
{
    [Register("android/os/Parcelable", ApiSince = 1, DoNotGenerateAcw = true)]
    public abstract class Parcelable : Java.Lang.Object
    {
        [Register("CONTENTS_FILE_DESCRIPTOR")]
        public const int ContentsFileDescriptor = 1;

        [Obsolete("This constant will be removed in the future version. Use Android.OS.ParcelableWriteFlags enum directly instead of this field.")]
        [Register("PARCELABLE_WRITE_RETURN_VALUE")]
        public const ParcelableWriteFlags ParcelableWriteReturnValue = ParcelableWriteFlags.ReturnValue;
    }
}

Базовый класс - это абстрактный класс библиотеки Android.Я хочу написать конструктор наподобие «Classname» выше без изменения абстрактного базового класса «Parcelable».

Я отредактировал исходный код с помощью следующего кода.

using Parcel = Android.OS.Parcel;
using Parcelable = Android.OS.Parcelable;

/// <summary>
/// Created by hashmi on 07/07/2015.
/// </summary>
public class LocationDetail : Parcelable
{

    private int id;
    private string name;
    private string address;
    private string latitude;
    private string longitude;


    public LocationDetail(int id, string name, string address, string latitude, string longitude) 
        : base(id, name, address, latitude, longitude) 
    {
        this.id = id;
        this.name = name;
        this.address = address;
        this.latitude = latitude;
        this.longitude = longitude;
    }
...
}

новая ошибка "Parcelable" не содержит конструктор, который принимает 5 аргументов

1 Ответ

1 голос
/ 03 июня 2019

Судя по документации Android для Parcelable, он не реализует никаких конструкторов, он реализует интерфейс создателя для построения Parcelable из Parcel. * 1006.*

Это типичная реализация Parcelable в соответствии с документацией для Android (в Java):

 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();
     }
 }

Как видите, Parcelable сама по себе не содержит конструкторов. Этот поток SO немного говорит о концепции Parcelables в Android.

Я натолкнулся на пару руководств, которые описывают, как использовать это в Xamarin, один предлагает вам реализовать его следующим образом: ( Это руководство можно найти здесь )

public class UserParcelable : Java.Lang.Object, IParcelable
{
    public UserParcelable()
    {
    }

    public int DescribeContents()
    {
        throw new NotImplementedException();
    }

    public void WriteToParcel(Parcel dest, [GeneratedEnum] ParcelableWriteFlags flags)
    {
        throw new NotImplementedException();
    }
}
...