Android: не удается загрузить значения по умолчанию из XML-файла настроек с помощью общих настроек

Попытка загрузить значения по умолчанию из файла preference.xml. и загрузите их, используя общие настройки, но значения по умолчанию из файла 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);
}

Он всегда печатает «не существует», что означает в этом примере, что он загружен неправильно?. И не могу понять, почему так.

Любая помощь будет оценена по достоинству, спасибо

/Эйдор


person Eidor    schedule 11.04.2012    source источник


Ответы (2)


Согласно этому вопросу, ваше местоположение для файла общих настроек неверно. Кроме того, если я правильно помню (не слишком хорошо себя чувствую, поэтому могу неправильно помнить), если вы хотите читать файлы с парами ключ-значение, вам лучше поместить их в папку с ресурсами и читать оттуда.

person omermuhammed    schedule 11.04.2012
comment
Хм, если я не ошибся. Согласно другому вопросу, ему интересно, где общие настройки хранятся на устройстве. В моем случае я хочу загрузить общие настройки по умолчанию при первом запуске приложения. Не уверен здесь, но хранить файлы в активах, я думаю, правильно, но в противном случае метаинформация должна храниться. Спасибо за ваше время! - person Eidor; 12.04.2012

Я не вижу ничего плохого в сохранении настроек в prefs.xml. После воссоздания вашего кода и его небольшого изменения я подозреваю, что вместо этого используется простой тег ‹Preference›-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, CheckboxPreferencete (проверьте здесь полный список подклассов, который соответствует вашим потребностям.

Если по какой-то причине вы все еще хотите использовать простые настройки, я полагаю, вам нужно загрузить их вручную следующим образом:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        prefs.edit().putString(getString(R.string.pref_key_1), getString(R.string.pref_default_1)).apply();
person Father Stack    schedule 29.05.2013