Не загружаются значения из SharedPreferences — при их использовании в расчетах они кажутся пустыми

при тестировании действия в моем приложении я вижу, что оно не использует значения, которые я установил с помощью PreferenceActivity.

Я могу подтвердить, что значения в PrefsActivity установлены правильно (по крайней мере, «локально»), потому что каждый раз, когда я его открываю, настройки точно такие же, как и при закрытии в последний раз...

Должен ли я указать в своей PreferenceActivity, в каком файле настроек хранить настройки, или это проблема с методами, которые я использую для импорта этих значений для использования в моей деятельности? Такое ощущение, что я облазил всю сеть, но так и не нашел четкого ответа на этот вопрос...

Здесь моя активность должна загружать настройки, это выглядит правильно? Я знаю, что это единственное, чего не хватает, потому что расчет работает просто отлично, когда я запускаю его в режиме отладки и вручную ввожу значения для использования...

public void OnStart() {
    // Loads the values for the calculator to use
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       bodymass = settings.getInt(getString(R.string.pref_key_user_mass).toString(), 0);
       gender = settings.getString(getString(R.string.pref_key_user_gender).toString(), "");

Кроме того, этот следующий код выглядит правильно для вас? (Я также был бы признателен, если бы кто-нибудь сказал мне, как сделать оператор «если», сравнивающий несколько переменных одновременно, например, если (одно из трех полей пусто) {сделать что-то})

    //Checks defined user gender and sets value to be used by calc accordingly
    if (gender == "male") {
        genderValue = 0.7;
    }
    else if (gender == "female") {
        genderValue = 0.6;
    }
    else if (gender == "") {
        settingsAlert();
    }

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

Вот код, который должен вызывать предупреждение:

public void settingsAlert() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("@string/dialog_setPrefs_text")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Intent gotoSettings = new Intent(ActivityCalc.this, ActivitySettings.class); 
                   startActivity(gotoSettings);
               }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    finish();
               }
           })
           .create();
}

--ОБНОВИТЬ--

Теперь мне удалось вызвать появление диалогового окна предупреждения, как и должно быть, я решил опубликовать строки кода, которые сделали это, чтобы другие с той же проблемой могли смотреть и учиться... :)

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

В качестве альтернативы вы можете определить его как объект AlertDialog и просто вызывать его, когда захотите:

    AlertDialog alert = builder.create();
    alert.show();

Я публикую здесь содержимое моего класса PreferenceActivity, чтобы вы могли его увидеть.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // This line will import the preferences to display in the settings activity
    addPreferencesFromResource(R.xml.settings);
}

Чтобы узнать, как создать файл ресурсов предпочтений, см. эту статью< /а>

Я больше не включал строку для указания имени общих настроек для использования, поскольку вместо этого я изменил метод get, чтобы использовать DefaultSharedPreferences:

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

Теперь я определил и инициализировал только те переменные, которые должны быть постоянными для остальной части действия:

private double genderValue = 0;
private String gender = "";
private int bodymass = 0;

Теперь приложение работает именно так, как должно — без сбоев и корректно загружает настройки, установленные в PreferenceActivity.


person ToVine    schedule 23.04.2012    source источник


Ответы (1)


Вам нужно использовать равные для предложений IF-ELSE

if (gender.equals("male")) { //equals
    genderValue = 0.7;
}
else if (gender.equalsIgnoreCase("female")) { //Here the equalsIgnorecase one
    genderValue = 0.6;
}
else if (gender == "") {
    settingsAlert();
} else {
    settingsAlert();  //Probably it always comes here.
}

Другое дело... правильно ли вы сохранили настройки с помощью «commit»?

  settings.edit().putString(getString(R.string.pref_key_user_gender).toString(), gender).commit();

--После третьего комментария---

Никогда не пытался. По одному на каждого работает нормально. Но если вы проверите комментарий «duanhong169», есть 2 следующих putString и последний зафиксированный, так что… попробуйте :) В любом случае вы можете просто сделать:

SharedPreferences.Editor editor = settings.edit();
editor.putString("gender", genderValue);
editor.putInt("bodymass", bodymassValue);
editor.commit();

И отвечая на ваш другой вопрос ... вам нужно «редактировать», чтобы сохранить предпочтение, вот как это работает. вы можете использовать его при паузе, при перезапуске или сразу после получения необходимых данных (внутри метода). То есть, если вам нужны данные для входа в систему, после того, как вы проверили правильность входа в систему, и если у вас сохранено другое значение входа в систему (другой пользователь), вы можете изменить.putString, чтобы сохранить новое значение внутри подтверждения onResult.

Лучшее, что вы можете сделать, это попробовать разные методы сохранения в настройках с разными тегами, а затем создать журнал и выполнить getString() из каждого тега, чтобы вы знали, какой из них работает, а затем вы можете выбрать лучший/более простой для ваш случай.

-- ОБНОВЛЕНИЕ 2--

Насколько я знаю... (я никогда этого не пробовал, и, как и вы, я действительно новичок в Android), ваш файл preferences.xml должен быть помещен в res/xml, а затем:

public class PreferencesFromXml extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

и чтобы получить данные:

PreferenceManager.setDefaultValues(this, R.xml.prefer, false);
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(this); 
p.getString("key", "value_default")
person Jordi    schedule 23.04.2012
comment
Нужно ли мне фиксировать изменения, сделанные в PreferenceActivity? Я думал, что фреймворк должен был справиться со всем этим сам по себе... (см. комментарий к ответу duanhong169 выше) - person ToVine; 23.04.2012
comment
Да, вам это нужно (вы можете проверить stackoverflow.com/q/2614719 и другой вариант вместо commit() в stackoverflow.com/q/5960678/1140648). Я думаю, вы можете получить доступ к данным. Проверьте stackoverflow.com/q/5951418 - person Jordi; 23.04.2012
comment
Итак, я предполагаю, что мне нужно сделать отдельный settings.edit() для каждой настройки, которую я хочу сохранить и сделать доступной для других действий, я прав? И затем, мне нужно будет вызывать коммит после каждого, или я могу просто суммировать все это одним коммитом в конце? И редактирование, и фиксация должны быть помещены либо в onPause, либо в onStop, или это не имеет значения? - person ToVine; 23.04.2012
comment
Я обновил вопрос с содержимым моей PreferenceActivity - не могу заставить его работать должным образом. Было бы здорово, если бы вы быстро взглянули на это и сказали мне, как это должно быть. Извините, что беспокою вас, я очень благодарен, что вы нашли время, чтобы помочь новичку в Java/Android - это много значит! :) - person ToVine; 23.04.2012
comment
Таким образом, второй аргумент в getString () — это значение по умолчанию для загрузки, если нет настроек? И должна ли get-функция вызываться внутри PreferenceActivity или только в основном действии, когда мне нужно вытащить данные? - person ToVine; 24.04.2012
comment
Да, второй аргумент является значением по умолчанию. И я не знаю о втором вопросе, я только вводил данные в прошлом и никогда не загружал из файла xml. Вы должны проверить это и, если хотите, объяснить результаты :) - person Jordi; 24.04.2012
comment
Функция Get не нужна - теперь все действительно работает так, как задумано, я обновлю исходный вопрос содержимым моей PreferenceActivity, чтобы показать другим, как я это сделал. Спасибо большое за вашу помощь! Пожалуйста, проголосуйте за мой вопрос, если считаете, что он актуален для других новичков... :) - person ToVine; 27.04.2012