2013-07-18 5 views
9

Zuerst habe ich überprüfen this answer.Wie erweitert man Android-Klasse, die Parcelable-Schnittstelle implementiert?

Was ich versuche zu tun ist, Location Klasse zu erweitern, die es nennt LocationPlus, die einige Mitgliedsvariablen hat. Funktionalität, die ich versuche zu erreichen, ist das Objekt LocationPlus Klasse von einer Aktivität zur anderen zu übergeben.

Hier ist meine CREATOR

public static final Parcelable.Creator<LocationPlus> CREATOR = new Parcelable.Creator<LocationPlus>() { 
    @Override 
    public LocationPlus createFromParcel(Parcel source) { 
     return new LocationPlus(source); 
    } 
    @Override 
    public LocationPlus[] newArray(int size) { 
     return new LocationPlus[size]; 
    } 
}; 

Problem, das ich dieser Fehler bin vor

Implicit super constructor Location() is undefined. Must explicitly invoke another constructor 

wenn Konstruktor

public LocationPlus(Parcel in) { 

Jemand in Kommentar zu schreiben versuchen, fragen Sie mich LocationPlus Klasse schreiben also hier ist es

+0

Post LocationPlus Klasse –

+0

@Hasslarn Code geschrieben. – Akram

+0

Nur um neugierig zu sein, was sagt es, wenn Sie einen leeren Konstruktor in LocationPlus setzen (versuchen Sie sowohl leer als auch mit Super Call): public LocationPlus() {super()}. Ich habe kein Java auf dieser Maschine, also kann ich es leider nicht versuchen. Der Standortkonstruktor ist möglicherweise geschützt. –

Antwort

0

Laut den Android-Dokumenten gibt es keinen -Konstruktor für die Location-Klasse. Wenn Sie Ihre Klasse LocationPlus initialisieren, müssen Sie entweder super(String provider) oder super(Location l) anrufen.

Edit: Korrigierte Syntax

(siehe Location Android Doc)

+0

Vielen Dank für Ihre wertvolle Zeit und Antwort Brian ich habe die Docs gesehen Ich suche nach irgendeiner Arbeit für dieses Problem. – Akram

+0

Was Sie tun müssen, ist einen Aufruf an einen 'Super (String provider)' oder 'super (Location l)' -Konstruktor in der 'LocationPlus (Parcel in)' Methode einzuschließen. – Brian

1

diese Lösung Versuchen:

public static final Parcelable.Creator<LocationPlus> CREATOR = 
    new Parcelable.Creator<LocationPlus>() { 
    @Override 
    public LocationPlus createFromParcel(Parcel in) { 

     Location l = Location.CREATOR.createFromParcel(in); 
     LocationPlus lp = new LocationPlus(l); 

     lp.mBattery= in.readInt(); 

     return lp; 
    } 

    @Override 
    public LocationPlus[] newArray(int size) { 
     return new LocationPlus[size]; 
    } 
}; 

@Override 
public void writeToParcel(Parcel parcel, int flags) { 
    super.writeToParcel(parcel, flags); 
    parcel.writeInt(mBattery); 

} 
4

Hallo Ich habe viel darüber forschen, aber ich konnte nicht finden nützliches etwas. Ich versuche die Lösung unten und es hat für mich funktioniert.

Nehmen wir an, Ihre Superklasse hat nur eine int-Variable namens "mData".

public class Location implements Parcelable { 
protected int mData; 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mData); 
} 

public static final Parcelable.Creator<Location> CREATOR 
     = new Parcelable.Creator<Location>() { 
    public Location createFromParcel(Parcel in) { 
     return new Location(in); 
    } 

    public Location[] newArray(int size) { 
     return new Location[size]; 
    } 
}; 

private Location(Parcel in) { 
    mData = in.readInt(); 
} 

}

Dann Ihre erweiterten Klasse hat nur int Variable mit dem Namen "mBattery".

public class LocationPlus extends Location { 
protected int mBattery; 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mBattery); 
} 

public static final Parcelable.Creator<LocationPlus> CREATOR 
     = new Parcelable.Creator<LocationPlus>() { 
    public LocationPlus createFromParcel(Parcel in) { 
     return new LocationPlus(in); 
    } 

    public LocationPlus[] newArray(int size) { 
     return new LocationPlus[size]; 
    } 
}; 

private LocationPlus(Parcel in) { 
    mBattery = in.readInt(); 
} 

}

Bisher arbeitet LocationPlus in Ordnung. Aber wir setzen keine Variable der Superklasse. Zuerst setze ich Superklassenvariablen auf erweiterte Klasse mit Super (..) -Methode. Aber es hat nicht funktioniert.

Anstelle des obigen Codes sollten Sie alle Variablen der Superklasse explizit festlegen. Superklassenvariablen sollten geschützt werden.Schluss Konstruktor sollte wie folgt sein:

private LocationPlus(Parcel in) { 
    mData = in.readIn(); 
    mBattery = in.readInt(); 
} 

und writeToParcel Methode sollte wie folgt sein:

public void writeToParcel(Parcel out, int flags) { 
    out.writeIn(mData); 
    out.writeInt(mBattery); 
} 
+0

Wenn Super (in) im LocationPlus-Konstruktor funktioniert, müssen Sie nur sicherstellen, dass auch super.writeToParcel (out, flags) in writeToParcel ausgeführt wird. – SilentByte

28

Parcel, der Speed ​​King

Nach google engineers, wird dieser Code ausgeführt wesentlich schneller. Einer der Gründe dafür ist, dass wir den Serialisierungsprozess explizit betrachten, anstatt ihn zu verwenden, um daraus Schlüsse zu ziehen. Es liegt auch nahe, dass der Code für diesen Zweck stark optimiert wurde.

public abstract class BaseClass implements Parcelable { 

    public String FullName; 
    public boolean IsValidUser; 
    public String UserName; 


    public BaseClass() { 
    } 


    protected BaseClass(Parcel in) { 
     FullName = in.readString(); 
     IsValidUser = in.readByte() != 0; 
     UserName = in.readString(); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(FullName); 
     dest.writeByte((byte) (IsValidUser ? 1 : 0)); 
     dest.writeString(UserName); 
    } 
} 

Child-Klasse wird als mit der Nutzung der Liste folgt die Zugabe in Parcel Objekt:

public class DerivedClass extends BaseClass { 

    public boolean IsSuccess; 
    public String Message; 
    public List<AnotherClass> AnotherClassObj; 


    public DerivedClass() { 
     super(); 
    } 

    protected DerivedClass(Parcel in) { 
     super(in); 
     AnotherClassObj = new ArrayList<AnotherClass>(); 
     IsSuccess = in.readByte() != 0; 
     Message = in.readString(); 
     AnotherClassObj = in.readArrayList(AnotherClass.class.getClassLoader()); 
    } 

    public static final Creator<DerivedClass> CREATOR = new Creator<DerivedClass>() { 
     @Override 
     public DerivedClass createFromParcel(Parcel in) { 
      return new DerivedClass(in); 
     } 

     @Override 
     public DerivedClass[] newArray(int size) { 
      return new DerivedClass[size]; 
     } 
    }; 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     super.writeToParcel(dest, flags); 
     dest.writeByte((byte) (IsSuccess ? 1 : 0)); 
     dest.writeString(Message); 
     dest.writeList(AnotherClassObj); 
    } 

    public int describeContents() { 
     return 0; 
    } 
} 

Ein weiteres Kind Klasse:

public class AnotherClass extends BaseClass { 
    public AnotherClass() { 
     super(); 
    } 

    protected AnotherClass(Parcel in) { 
     super(in); 
    } 

    public int describeContents() { 
     return 0; 
    } 

    public static final Creator<AnotherClass> CREATOR = new Creator<AnotherClass>() { 
     @Override 
     public AnotherClass createFromParcel(Parcel in) { 
      return new AnotherClass(in); 
     } 

     @Override 
     public AnotherClass[] newArray(int size) { 
      return new AnotherClass[size]; 
     } 
    }; 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     super.writeToParcel(dest, flags); 
    } 
} 

In Aktivität:

Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
intent.putExtra("UserObject", parcelableObject); 
startActivity(intent); 
finish(); 

In Empfang Aktivität:

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
     userObject = extras.getParcelable("UserObject"); 
}