ciao a tutti .
Sto sviluppando un'app che vorrei , piu avanti , presentare come applicazione Android per gestire un controllore.
Ho bisogno di creare dei layout e delle custom view
Sto provando con onDraw a disegnare e cambiare colore ad un rettangolo , su evento del pulsante cambio lo stato di una variabile che poi interrogo per cambiare colore al rettangolo stesso.
Il problema nasce nel momento in qui passo da landscape a portrait .Sto provando con questo codice per il salvare lo stato ma non funziona ....
Quote:
private void onRestoreInstanceStateStandard(Parcelable state)
{ if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
Log.d(tag," onRestoreInstanceStateStandard chiamato");
return;
}
SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
memStatus = ss.memStatus;
Log.d(tag," onRestoreInstanceStateStandard chiamato dopo memStatus = ss.memStatus;");
}
private Parcelable onSaveInstanceStateStandard()
{
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.memStatus = this.memStatus;
Log.d(tag," onSaveInstanceStateStandard chiamato");
return ss;
}
e con questo ....
Quote:
public static class SavedState extends BaseSavedState {
int memStatus;
SavedState(Parcelable superState)
{
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
out.writeInt(memStatus);
Log.d(tag,"Salvataggio memStatus");
Log.d(tag,Integer.toString(memStatus));
}
private SavedState(Parcel in) {
super(in);
memStatus = in.readInt();
Log.d(tag,"Ripresa memStatus");
Log.d(tag,Integer.toString(memStatus));
}
@Override
public String toString() {
return "CircleView defRadius:" + memStatus;
}
@SuppressWarnings("hiding")
public static final Parcelable.Creator<SavedState> CREATOR
= new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
}
posso premere sulla custom view e vedere il colore che cambia , per cui l'evento click e il cambio di colore vanno bene , ma se capovolto lo smart phone il colore viene reinizializzato
Avete qualche idea su come salvare lo stato i gli stati di una custom view?
grazi e saluti
- - - Aggiornato - - -
ho risolto aggiungendo la classe statica SavedState alla mia custom view .
Nella custom view ho aggiunto questi 4 metodi di cui due in override
Quote:
private Parcelable onSaveInstanceStateStandard()
{
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.memStatus = this.memStatus;
return ss;
}
private void onRestoreInstanceStateStandard(Parcelable state)
{
if (!(state instanceof SavedState))
{
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
memStatus = ss.memStatus;
}
@Override
protected void onRestoreInstanceState(Parcelable p)
{
this.onRestoreInstanceStateStandard(p);
this.initRectangleView();
}
@Override
protected Parcelable onSaveInstanceState()
{
return this.onSaveInstanceStateStandard();
}
la classe statica interna è la seguente
Quote:
public static class SavedState extends BaseSavedState {
int memStatus;
SavedState(Parcelable superState)
{
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
out.writeInt(memStatus);
Log.d(tag, "Salvataggio memStatus");
Log.d(tag,Integer.toString(memStatus));
}
//Read back the values
private SavedState(Parcel in) {
super(in);
memStatus = in.readInt();
Log.d(tag,"Ripresa memStatus");
Log.d(tag,Integer.toString(memStatus));
}
@Override
public String toString() {
return "CircleView defRadius:" + memStatus;
}
@SuppressWarnings("hiding")
public static final Parcelable.Creator<SavedState> CREATOR
= new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
Android Studio mi da in rosso i due motodi
onRestoreInstanceState(Parcelable p) e onSaveInstanceState() in quanto dice che dovrei fare la chiamata alla super classe , solo che se lo faccio mi crasha l'applciazione
Senza chiamata alla superclasse funziona tutto per bene
In effetti non c'e' bisogno di chiamare la superclasse perche ci pensano gli altri due metodi in override prima della classe statica
ciao
- - - Aggiornato - - -
ho risolto cpn le seguenti modifiche.
Nella custom view ho aggiunto questi 4 metodi di cui due in override
Quote:
private Parcelable onSaveInstanceStateStandard()
{
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.memStatus = this.memStatus;
return ss;
}
private void onRestoreInstanceStateStandard(Parcelable state)
{
if (!(state instanceof SavedState))
{
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
memStatus = ss.memStatus;
}
@Override
protected void onRestoreInstanceState(Parcelable p)
{
this.onRestoreInstanceStateStandard(p);
this.initRectangleView();
}
@Override
protected Parcelable onSaveInstanceState()
{
return this.onSaveInstanceStateStandard();
}
la classe statica interna è la seguente
Quote:
public static class SavedState extends BaseSavedState {
int memStatus;
SavedState(Parcelable superState)
{
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
out.writeInt(memStatus);
Log.d(tag, "Salvataggio memStatus");
Log.d(tag,Integer.toString(memStatus));
}
//Read back the values
private SavedState(Parcel in) {
super(in);
memStatus = in.readInt();
Log.d(tag,"Ripresa memStatus");
Log.d(tag,Integer.toString(memStatus));
}
@Override
public String toString() {
return "CircleView defRadius:" + memStatus;
}
@SuppressWarnings("hiding")
public static final Parcelable.Creator<SavedState> CREATOR
= new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
Android Studio mi da in rosso i due motodi
onRestoreInstanceState(Parcelable p) e onSaveInstanceState() in quanto dice che dovrei fare la chiamata alla super classe , solo che se lo faccio mi crasha l'applciazione
Senza chiamata alla superclasse funziona tutto per bene
In effetti non c'e' bisogno di chiamare la superclasse perche ci pensano gli altri due metodi in override prima della classe statica
ciao