2013-10-09 61 views
0

我正在使用兩個微調項目。第二個微調器中的項目會根據第一個微調器項目的選擇動態填充。我已實施OnItemSelectedListener並覆蓋onItemSelected來實現此目的。我也使用SharedPreferences來保存某些數據來照顧屏幕旋轉。我面臨的麻煩是,一切工作完美,並與Android 4.0版的預期一樣,但相同的代碼無法與Android(4.1,4.2,4.3)的上述版本和第二個微調選定項在屏幕旋轉中重置。什麼推動我堅果是,與Android 4.0版的東西工作得很好。有什麼建議麼?屏幕旋轉時出現的問題持續android微調項目

+0

請發佈logcat以顯示您遇到的錯誤 –

+0

我沒有收到任何錯誤消息。就是這樣,第二個微調器的選定項目不會停留在版本4.1以上的屏幕旋轉中。 – Kaps

+0

然後發佈可能的代碼,除非我們都會在這裏猜測 –

回答

0

我發現了一個解決方案,雖然不是完美的,但更多的是一個鉤子,如果屏幕旋轉,我假設該項目的第一個微調項的選定項目和它的索引將是相同的(因爲我正在處理自然數),所以我我相應地將數據設置在第二個微調器中,否則創建一個新的微調器並在第一個微調器的onItemSelected偵聽器中設置所需的數據。不是很乾淨,但適用於我(4.0及更高版本)。

     if(firstSpinnerItemSelected != position || firstSpinnerItemSelected == 0){ 
        firstSpinner.setSelection(secondSpinnerItemSelected, true); 
        ArrayAdapter secondAdapter = new ArrayAdapter(
         context, R.layout.spinner_item, itemList); 
        secondSpinner.setAdapter(secondAdapter); 
       } 
       else{ 
        secondSpinner.setSelection(secondSpinnerItemSelected, false); 
        }

0

我不知道它可能與版本> 4.0有什麼關係,但是通過將要保留的數據寫入onSaveInstanceState(Bundle out)中的包中來處理配置更改可能是一個更好的辦法,在onCreate(Bundle savedInstance)中讀取它。

即使它不會「修復」您所看到的行爲怪異,但它應該工作...

0

在我看來是不使用SharedPreferences堅持數據是個好主意。同時把一個Spinner放入onSaveInstanceState()Bundle並不是個好主意。除了這是不可能的事實之外,這樣做會導致你的新活動持續引用該Spinner,該引用持有對舊活動的引用,這會引起大量內存泄漏。

您的微調器的內容通過某種適配器設置。您應該確保您的新活動可以重新創建該適配器。然後,將getItemSelectedId()或getItemSelectedPosition()放入Bundle中,以便可以在新Activity中恢復選擇。

+0

覆蓋onPause()和onResume()就足以滿足我的需求。當我說數據時,它只是在微調器中選擇的項目(整數值)。我正在重新創建適配器並將其與重新創建的微調器一起附加以確保我沒有任何活動參考。 – Kaps

-1

嘗試實施方法

onSaveInstaceState() // to save current selected items; 

onRestoreInstanceState() // to select saved items. 

或者,您可以添加到您的艙單活動標籤

android:configChanges="orientation" 

那麼你的活動不會被重建,一切都應該是相同