2011-12-27 91 views
0

最近幾天我一直試圖使我的應用程序的列表首選項無濟於事。我讀過無數的線索,但仍然沒有。ListPreference無法正確保存

請注意,我仍然處於學習過程中,顯然,所以我的知識是相當有限的,至少可以說。

我想製作一個程序,允許用戶輕鬆更改ROM上的某些系統參數。

public class MyPersArray extends PreferenceActivity implements OnSharedPreferenceChangeListener { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pers); 
      getPrefs(); 

[....] 

public String ListPreference; 

    private void getPrefs() { 
     // Get the xml/preferences.xml preferences 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
     // register preference change listener 
     prefs.registerOnSharedPreferenceChangeListener(this); 
     ListPreference = prefs.getString("gpsPref", "0"); 
    } 


    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {  
     if(Integer.valueOf(ListPreference) == 0) { 
      ListPreference = prefs.getString("gpsPref", "0"); 
      Commands.doGps0(); 
      Toast.makeText(getApplicationContext(), "0",Toast.LENGTH_SHORT).show(); 
     } else if(Integer.valueOf(ListPreference) == 1) { 
      ListPreference = prefs.getString("gpsPref", "1"); 
      Commands.doGps1(); 
      Toast.makeText(getApplicationContext(), "1",Toast.LENGTH_SHORT).show(); 
     } else if(Integer.valueOf(ListPreference) == 2) { 
      ListPreference = prefs.getString("gpsPref", "2"); 
      Commands.doGps2(); 
      Toast.makeText(getApplicationContext(), "2",Toast.LENGTH_SHORT).show(); 
     } else if(Integer.valueOf(ListPreference) == 3) { 
      ListPreference = prefs.getString("gpsPref", "3"); 
      Commands.doGps3(); 
      Toast.makeText(getApplicationContext(), "3",Toast.LENGTH_SHORT).show(); 
     } else if(Integer.valueOf(ListPreference) == 4) { 
      ListPreference = prefs.getString("gpsPref", "4"); 
      Commands.doGps4(); 
      Toast.makeText(getApplicationContext(), "4",Toast.LENGTH_SHORT).show(); 
     } else if(Integer.valueOf(ListPreference) == 5) { 
      ListPreference = prefs.getString("gpsPref", "5"); 
      Toast.makeText(getApplicationContext(), "5",Toast.LENGTH_SHORT).show(); 
      Commands.doGps5(); 
     } 
    } 

這是我偏好使用的代碼。

我的XML看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 

    <ListPreference 
     android:defaultValue="0" 
     android:dialogTitle="Pick your Region" 
     android:enabled="true" 
     android:entries="@array/gps_entries" 
     android:entryValues="@array/gps_values" 
     android:key="gpsPref" 
     android:negativeButtonText="Cancel" 
     android:summary="Enhance GPS signal and speed" 
     android:title="GPS Preference" > 
    </ListPreference> 
</PreferenceScreen> 

而且我的數組是這樣的:

<string-array name="gps_values"> 
    <item>0</item> 
    <item>1</item> 
    <item>2</item> 
    <item>3</item> 
    <item>4</item> 
    <item>5</item> 
</string-array> 
<string-array name="gps_entries"> 
    <item>Europe</item> 
    <item>Africa</item> 
    <item>Asia</item> 
    <item>Australia</item> 
    <item>North America</item> 
    <item>South America</item> 
</string-array> 

偏好代碼和getPrefs代碼包含在同一個Java文件。這是我發現這個「工作」的唯一途徑。

問題是,使用此代碼時,ListPreference未得到正確更新,並且該命令不會在單擊ListPreference時執行。它只會被更新,如果我再次點擊GPS配置項目。

這是一個小小的截圖,讓你可以更好地理解。 http://i42.tinypic.com/t7bebq.png(還未發佈圖片)

非常感謝您的時間。

+0

你應該給你的變量ListPreference一個以小寫字母開頭的名字。 int值開關,第三,使用參數doGps,你的代碼將是6行而不是30. – Snicolas 2011-12-27 16:22:32

+0

我是一個新手,因爲我說,請你給一些更多的信息? – 2011-12-27 16:49:55

回答

0

自己完成修復。我的prefs class和sharedpreference manager調用者正在使用相同的prefs類,所以在實例重新啓動後它被保存了。

添加

getPrefs內onSharedPreferenceChanged固定它。

+0

也實現在PreferenceChangedListener而不是SharedPrefsListener,好得多。 – 2012-02-01 13:47:28