0

嘗試從preference.xml文件加載默認值。並使用sharedpreferences加載它們,但xml文件中的defaultValues不會爲我加載。這是我的代碼。Android:無法使用sharedpreferences從首選項xml文件加載默認值

/res/xml/prefs.xml

<?xml version="1.0" encoding="utf-8"?> 
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="prefs" android:title="prefs"> 
     <Preference android:key="bild" android:title="bild" android:defaultValue="This is bild,0,false"/> 
     <Preference android:key="bild2" android:title="bild2" android:defaultValue="This is bild2,1,false"/> 
     <Preference android:key="bild3" android:title="bild3" android:defaultValue="This is bild3,2,false"/> 
    </PreferenceScreen> 

和Android代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 
    PreferenceManager.setDefaultValues(this, R.xml.prefs, false); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    String picture = prefs.getString("bild", "dosen't exist"); 
    Log.e("test", "This is the picture Value: " + picture); 
} 

它總是輸出 「dosent't存在」 的,這意味着在這個示例中,它isen' t正確加載?並不知道爲什麼它。

任何幫助,將不勝感激,謝謝

/Eidor

回答

0

this問題,您的共享偏好文件位置是錯誤的。另外,如果我記得正確(感覺不太好,所以可能記得不正確),如果你想讀取具有鍵值對的文件,最好將它們放在資產文件夾中並從那裏讀取。

+0

嗯,如果我have't錯誤missunderstood它。根據另一個問題,他想知道在設備上存儲sharedprefrences的位置。在我的情況下,我想加載應用程序首次啓動時的默認sharedpreferences。不知道這裏,但存儲文件資產我認爲是正確的,但元信息應存儲,否則。謝謝你的時間! – Eidor 2012-04-12 05:55:16

0

我沒有看到任何錯誤的保存在prefs.xml。重新創建你的代碼並略微修改之後,我得到了懷疑平原<首選項> -Tag代替:

的strings.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <string name="app_name">TestPreference</string> 
    <string name="action_settings">Settings</string> 

    <string name="pref_header_1">Preference Category</string> 

    <string name="pref_default_1">Image 1</string> 
    <string name="pref_default_2">Image 2</string> 

    <string name="pref_title_1">Title 1</string> 
    <string name="pref_title_2">Title 2</string> 
    <string name="pref_title_3">Title 3</string> 

    <string name="pref_key_1">pref_key_1</string> 
    <string name="pref_key_2">pref_key_2</string> 
    <string name="pref_key_3">pref_key_3</string> 

    <string-array name="pref_entries_3"> 
     <item>One</item> 
     <item>Two</item> 
     <item>Five</item> 
    </string-array> 
    <string-array name="pref_values_3"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </string-array> 
</resources> 

preference.xml

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

    <PreferenceCategory android:title="@string/pref_header_1" > 
     <Preference 
      android:defaultValue="@string/pref_default_1" 
      android:key="@string/pref_key_1" 
      android:title="@string/pref_title_1" /> 

     <EditTextPreference 
      android:defaultValue="@string/pref_default_2" 
      android:key="@string/pref_key_2" 
      android:title="@string/pref_title_2" /> 

     <ListPreference 
      android:defaultValue="1" 
      android:entries="@array/pref_entries_3" 
      android:entryValues="@array/pref_values_3" 
      android:key="@string/pref_key_3" 
      android:negativeButtonText="@null" 
      android:positiveButtonText="@null" 
      android:title="@string/pref_title_3" /> 
    </PreferenceCategory> 

</PreferenceScreen> 

MainActivity.java

private Logger log = LoggerFactory.getLogger(getClass()); 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Get default preferences and load default values 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    PreferenceManager.setDefaultValues(this, R.xml.preference, false); 

    // Check if keys exist in sharedPreferences 
    log.debug("Contains keys #1: {}; #2: {}; #3: {}", new Object[] { 
      prefs.contains(getString(R.string.pref_key_1)), 
      prefs.contains(getString(R.string.pref_key_2)), 
      prefs.contains(getString(R.string.pref_key_3)) 
    }); 

    // Get preferences values 
    String value1 = prefs.getString(getString(R.string.pref_key_1), "not found"); 
    String value2 = prefs.getString(getString(R.string.pref_key_2), "not found"); 
    String value3 = prefs.getString(getString(R.string.pref_key_3), "not found"); 
    log.debug("Values #1: {}; #2: {}; #3: {}", new Object[] { value1, value2, value3 }); 

    // prefs.edit().putString(getString(R.string.pref_key_1), getString(R.string.pref_default_1)).apply(); 
} 

記錄結果

"Contains keys #1: false; #2: true; #3: true" 
"Values #1: not found; #2: Image 2; #3: 1" 



結論

如果你想有一定的偏好是用戶可編輯的,你可能會更好使用混凝土偏好如EditTextPreference,ListPreference,Checkbo xPreferencete(check here for a complete list of subclasses)適合您的需求。

如果由於某種原因,你仍然要使用純偏好,我想你必須手動加載它們像這樣:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     prefs.edit().putString(getString(R.string.pref_key_1), getString(R.string.pref_default_1)).apply();