2016-11-17 91 views
1

我擴展了android.widget.Spinner。並在我的實現中添加了一個int字段。現在我想讓它保存方向更改的字段值。我首先想到的是用Bundle對象爲:如何保存自定義微調器狀態

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

但我得到一個錯誤:

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

所以我發現微調source code和想通了,我不得不延長內部靜態類SavedState並使用它保存我的字段值。但我無法做到這一點。 Android Studio建議它「無法解析符號'保存狀態'」。 enter image description here

那麼我該如何保存自定義Spinner的狀態?

+0

的更好的方法是使用一個靜態值,並分配所選擇的位置,以靜態值和設定在的onResume方法該值。 –

回答

1

您無法實際擴展Spinner.SavedState,因爲它是在Spinner類中創建的。即使您嘗試重寫Spinner.onSaveInstanceState,也無法在自定義類中實現此方法,因爲您無權訪問Spinner類的私有變量。

實際上你可以做的是創建一個實現Parcelable的新類,並使用從基類返回的值來構造你自己的類。

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