2015-02-24 71 views
2

我對其中的各種Spinners有興趣。爲了讓這些spinners顯示一個初始值(非可選值),我使用了一個自定義的arrayAdapter(SpinnerHintAdapter)。這個類所做的唯一重要的事情就是覆蓋getCount(),這樣就不會顯示選擇數組的最後一項,這就是初始值的存儲位置。
這一切工作正常,直到你旋轉設備,然後由於某種原因,旋轉器設置在列表的最後正常值,即使Fragment類仍然認爲它設置在初始值。
任何人都知道爲什麼發生這種情況和/或如何解決這個問題?Android旋轉器在旋轉時動作不可思議

代碼示例:
片段:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_free_top_up, container, false); 
    Spinner pet = (Spinner) rootView.findViewById(R.id.pet); 
    SpinnerHintAdapter<CharSequence> petAdapter = SpinnerHintAdapter.createFromResource(getActivity(), 
     R.array.pet_array, android.R.layout.simple_spinner_item); 
    petAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    pet.setAdapter(petAdapter); 
    pet.setSelection(pet.getCount()); 
    return rootView; 
} 

SpinnerHintAdapter:

@Override 
public int getCount() { 
    int count = super.getCount(); 
    // The last item will be the hint. 
    return count > 0 ? count - 1 : count; 
} 

例如串陣列

<string-array name="pet_array"> 
    <item>Yes</item> 
    <item>No</item> 
    <item>(initial value)</item> 
</string-array> 
+0

似乎'pet.setSelection(pet.getCount())'應該用'0'或'1' caz'pet.getCount()'返回'2'來調用。或者你的hacky'getCount'在Spinner中混淆了某些事物。 :/ – ytRino 2015-02-24 10:27:56

+0

它應該返回2,因爲我想要顯示初始值 – dashhund 2015-02-24 10:42:04

+0

也許你可以避免所有這些麻煩,只用於它的意圖(有可選項目)的微調,並以另一種方式顯示這個其他項目? – lordstyx 2015-02-24 13:00:20

回答

1

當您旋轉裝置被重新創建的活動。您需要重寫onSavedInstanceState函數,將數據保存在Bundle中,然後再次使用onCreate中的數據。

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    //save your data 
} 

然後用你的onCreate來恢復你的微調。

+0

這不是我問的,我知道這一點,但它與我的問題無關。問題是應該在onCreate方法中設置的初始值沒有被選中,另一個值是。在這一點上,每次我旋轉設備的價值應重置爲初始值(列表的最後),而是設置爲列表中的最後一個元素。 – dashhund 2015-02-24 09:21:21

+0

我認爲這個答案很有幫助。可能會發生活動重新創建**和**片段不是**重新創建。 – ytRino 2015-02-24 10:33:13

+0

不,我檢查過,片段的onCreate方法再次被調用 – dashhund 2015-02-24 10:39:54