2013-07-18 12 views
9

Prima di tutto ho il controllo this answer.Come estendere la classe Android che implementa l'interfaccia Parcelable?

Quello che sto cercando di fare è estendere la classe Location chiamandola LocationPlus che ha alcune variabili membro . la funzionalità che sto cercando di ottenere è passare l'oggetto della classe LocationPlus da un'attività all'altra.

Ecco il mio problema 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]; 
    } 
}; 

sto affrontando è questo errore

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

quando si cerca di scrivere costruttore

public LocationPlus(Parcel in) { 

Qualcuno in commento mi chiedono di inviare classe LocationPlus quindi qui è

public class LocationPlus extends Location{ 

    private int mBattery = -1; 

    public LocationPlus(String locationName) { 
     super(locationName); 
    } 

    public LocationPlus(Location location) { 
     super(location); 
    } 

    public int getmBattery() { 
     return mBattery; 
    } 

    public void setmBattery(int mBattery) { 
     this.mBattery = mBattery; 
    } 
    @Override 
    public int describeContents() { 
     return 0; 
    } 

    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]; 
     } 
    }; 

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

    public LocationPlus(Parcel in) { 
     mBattery =in.readInt(); 
    } 
} 
+0

Inserisci LocationPlus classe –

+0

codice @Hasslarn postato. – Akram

+0

Solo per essere curiosi, cosa dice se metti un costruttore vuoto in LocationPlus (prova sia vuoto che super): public LocationPlus() {super()}. Non ho Java su questa macchina, quindi sfortunatamente non posso provarlo. Il costruttore di posizioni potrebbe essere protetto. –

risposta

0

In base ai documenti Android, non esiste un costruttore Location() per la classe Location. Quando si inizializza la classe LocationPlus, è necessario chiamare super(String provider) o super(Location l).

Edit: Corretto sintassi

(Vedi Location Android Doc)

+0

Grazie per il tuo prezioso tempo e risposta Brian ho visto i documenti che sto cercando per risolvere il problema. – Akram

+0

Quello che devi fare è includere una chiamata a un costruttore 'super (fornitore di stringhe)' o 'super (Location l)' nel metodo 'LocationPlus (Parcel in)'. – Brian

1

provare questa soluzione:

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

Hi Ho fare ricerca molto su questo, ma non riuscivo a trovare utile qualsiasi cosa Provo la soluzione qui sotto e ha funzionato per me.

Diciamo che la vostra super classe ha solo la variabile int denominata "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(); 
} 

}

Quindi, la classe estesa Basta int variabile denominata "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(); 
} 

}

Finora, LocationPlus funziona bene. Ma non impostiamo la variabile della super classe. In primo luogo, ho impostato le variabili di super classe sulla classe estesa con il metodo super (..). Ma non ha funzionato.

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

Invece del codice sopra, è necessario impostare tutte le variabili di super classe in modo esplicito. Le variabili di super classe dovrebbero essere protette.costruttore finale dovrebbe essere simile a questo:

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

e il metodo writeToParcel dovrebbe essere come questo:

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

L'esecuzione di super (in) nel costruttore LocationPlus dovrebbe funzionare, è necessario assicurarsi di fare anche super.writeToParcel (out, flags) in writeToParcel. – SilentByte

28

Parcelable, il re della velocità

Secondo google engineers, questo codice verrà eseguito significativamente più veloce. Una delle ragioni di ciò è che siamo espliciti sul processo di serializzazione invece di usare la riflessione per dedurlo. È anche ovvio che il codice è stato fortemente ottimizzato per questo scopo.

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

classe bambino sarà il seguente con l'utilizzo di lista aggiungendo in oggetto Parcelable:

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

Un'altra bambino classe:

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 attività:

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

In attività che riceve:

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