2016-11-17 5 views
1

Ich erweiterte android.widget.Spinner. und fügte meiner Implementierung ein int-Feld hinzu. Jetzt möchte ich, dass der Feldwert bei der Orientierungsänderung gespeichert wird. Mein erster Gedanke wurde mit Bundle-Objekt für die:Wie speichere ich den benutzerdefinierten Spinner-Status

override fun onSaveInstanceState(): Parcelable { 
    val bundle = Bundle() 
    bundle.putParcelable(SUPER_STATE, super.onSaveInstanceState()) 
    bundle.putInt(PREV_ITEM, this.prevItem) // ... save stuff 
    return bundle 
} 

override fun onRestoreInstanceState(state: Parcelable?) { 
    val newState: Parcelable 
    if (state is Bundle) { 
     this.prevItem = state.getInt(PREV_ITEM) // ... load stuff 
     newState = state.getParcelable<Parcelable>(SUPER_STATE) 
     super.onRestoreInstanceState(newState) 
    } 
    super.onRestoreInstanceState(state) 
} 

Aber ich erhalte eine Fehlermeldung:

java.lang.ClassCastException: android.os.Bundle cannot be cast to android.widget.Spinner$SavedState 

So fand ich Spinner source code und herausgefunden, dass ich innere statische Klasse savedState und es erweitern müssen verwenden um meinen Feldwert zu speichern. Aber das konnte ich nicht. Android Studio schlägt vor, dass es das Symbol "Saved State" nicht auflösen kann. enter image description here

Also was mache ich, um den Zustand meiner benutzerdefinierten Spinner zu speichern?

+0

Der bessere Weg besteht darin, einen statischen Wert zu verwenden und die ausgewählte Position diesem statischen Wert zuzuordnen und diesen Wert in der OnResume-Methode festzulegen. –

Antwort

1

Sie können Spinner.SavedState nicht wirklich erweitern, da es innerhalb der Spinner-Klasse erstellt wurde. Selbst wenn Sie versuchen, Spinner.onSaveInstanceState zu überschreiben, können Sie diese Methode nicht in Ihrer benutzerdefinierten Klasse implementieren, da Sie keinen Zugriff auf private Variablen der Spinner-Klasse haben.

Sie können tatsächlich eine neue Klasse erstellen, die Parcelable implementiert, und den von der Basisklasse zurückgegebenen Wert verwenden, um Ihre eigene Klasse zu erstellen.

@Override 
public Parcelable onSaveInstanceState() { 
    final MySavedState ss = new MySavedState(super.onSaveInstanceState()); 
    ss.myInt = 100; 
    return ss; 
} 

@Override 
public void onRestoreInstanceState(Parcelable state) { 
    MySavedState ss = (MySavedState) state; 

    super.onRestoreInstanceState(ss.getSuperState()); 

    if(ss.myInt == 100) { 
     Log.d("TAG", "Success!"); 
    } 
} 

static class MySavedState extends Spinner.BaseSavedState { 

    int myInt; 

    public MySavedState(Parcelable superState) { 
     super(superState); 
    } 

    public MySavedState(Parcel source) { 
     super(source); 

     myInt = source.readInt(); 
    } 
} 
Verwandte Themen