Странная проблема с общими настройками в Android - PullRequest
2 голосов
/ 01 сентября 2011

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

public class ActivitySettings extends PreferenceActivity {

@SuppressWarnings("unused")
private static String TAG = "ActivitySettings";

private static final String PREFS_NAME = "preferences";

private static final String DISABLE_CHECK = "disableCheck";
private static final String ALWAYS_CONFIRM = "alwaysConfirm";
private static final String NEVER_CONFIRM = "neverConfirm";
private static final String SHOW_NOTIFICATION = "showNotification";
private static final String SHOW_ON_BOOT = "showOnBoot";
private static final String HIDE_ICON = "hideIcon";
private static final String LOGGING = "logging";

private Context context = this;

private CheckBoxPreference disableCodeCheck;
private CheckBoxPreference alwaysAskForConf;
private CheckBoxPreference neverAskForConf;
private CheckBoxPreference showNotif;
private CheckBoxPreference showAtBoot;
private CheckBoxPreference hideIcon;
private Preference exportData;
private Preference importData;
private Preference cleanUp;
private Preference reset;
private CheckBoxPreference logging;

private boolean isDisableCodeCheck;
private boolean isAlwaysAskForConf;
private boolean isNeverAskForConf;
private boolean isShowNotif;
private boolean isShowAtBoot;
private boolean isHideIcon;
private boolean isLogging;

private void loadPreferences() {
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);

    isDisableCodeCheck = prefs.getBoolean(DISABLE_CHECK, false);
    isAlwaysAskForConf = prefs.getBoolean(ALWAYS_CONFIRM, false);
    isNeverAskForConf = prefs.getBoolean(NEVER_CONFIRM, false);
    isShowNotif = prefs.getBoolean(SHOW_NOTIFICATION, false);
    isShowAtBoot = prefs.getBoolean(SHOW_ON_BOOT, false);
    isHideIcon = prefs.getBoolean(HIDE_ICON, false);
    isLogging = prefs.getBoolean(LOGGING, false);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.xml.settings);

    disableCodeCheck = (CheckBoxPreference) findPreference("disable_code_check");
    alwaysAskForConf = (CheckBoxPreference) findPreference("always_ask_for_conf");
    neverAskForConf = (CheckBoxPreference) findPreference("never_ask_for_conf");
    showNotif = (CheckBoxPreference) findPreference("show_notif");
    showAtBoot = (CheckBoxPreference) findPreference("show_at_boot");
    hideIcon = (CheckBoxPreference) findPreference("hide_icon");
    exportData = findPreference("exp");
    importData = findPreference("imp");
    cleanUp = findPreference("clean_up");
    reset = findPreference("reset");
    logging = (CheckBoxPreference) findPreference("logging");

    loadPreferences();

    //here are also booleans modified

@Override
protected void onStop() {
    super.onStop();
    savePreferences();
}

private void savePreferences() {
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);

    prefs.edit().putBoolean(DISABLE_CHECK, isDisableCodeCheck);
    prefs.edit().putBoolean(ALWAYS_CONFIRM, isAlwaysAskForConf);
    prefs.edit().putBoolean(NEVER_CONFIRM, isNeverAskForConf);
    prefs.edit().putBoolean(SHOW_NOTIFICATION, isShowNotif);
    prefs.edit().putBoolean(SHOW_ON_BOOT, isShowAtBoot);
    prefs.edit().putBoolean(HIDE_ICON, isHideIcon);
    prefs.edit().putBoolean(LOGGING, isLogging);

    prefs.edit().commit();
}

}

Вот что происходит:

  1. В файле shared_prefs: предпочтения созданы два файла.xml и packagename_preferences.xml.Не знаю почему, предоставляется PREFS_NAME.

  2. загрузка настроек выполняется в методах onCreate, сохранение и фиксация в onStop

  3. с использованием оболочки adbи кошка, я смотрю файлы, пока приложение работает, и вот сценарий:

    • я открываю настройки и ставлю галочку, и packagename_preferences.xml создается с правильным значением
    • я нажимаюзадний и второй файл создан - Preferences.xml, который выглядит следующим образом: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map />
    • при повторном открытии настроек все выглядит как при первом запуске, а значения в packagename_preferences.xml изменяются на значения по умолчанию (?)
  4. я знаю, что есть и встроен механизм PreferenceActivity, но я не хочу его использовать, потому что мне нужен доступ к другим настройкам из других действий.


РЕДАКТИРОВАТЬ


Я создал такое приложение:

package pl.test;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;

public class TestActivity extends Activity {
String s = "0";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    SharedPreferences sp = getSharedPreferences("pref", 0);  
    s = sp.getString("setting2", "1");
    s = "5";
}

@Override
public void onStop() {
    super.onStop();
    SharedPreferences sp = getSharedPreferences("pref", 0);
    sp.edit().putString("setting2", s);
    sp.edit().commit();
}

}

И это не работает, просто не работаетсохранить строку в pref.xml.Что не так!?

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Ваша проблема в том, что вы генерируете новый объект Editor при каждом вызове sp.edit ().Таким образом, ваш вызов sp.edit (). Commit () создает новый редактор, в котором нет изменений для фиксации.Попробуйте это:

private void savePreferences() {
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = prefs.edit(); 
    editor.putBoolean(DISABLE_CHECK, isDisableCodeCheck);
    editor.putBoolean(ALWAYS_CONFIRM, isAlwaysAskForConf);
    editor.putBoolean(NEVER_CONFIRM, isNeverAskForConf);
    editor.putBoolean(SHOW_NOTIFICATION, isShowNotif);
    editor.putBoolean(SHOW_ON_BOOT, isShowAtBoot);
    editor.putBoolean(HIDE_ICON, isHideIcon);
    editor.putBoolean(LOGGING, isLogging);
    editor.commit();
}

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

private void savePreferences() {
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0)
        prefs.edit().putBoolean(DISABLE_CHECK, isDisableCodeCheck)
        .putBoolean(ALWAYS_CONFIRM, isAlwaysAskForConf)
        .putBoolean(NEVER_CONFIRM, isNeverAskForConf)
        .putBoolean(SHOW_NOTIFICATION, isShowNotif)
        .putBoolean(SHOW_ON_BOOT, isShowAtBoot)
        .putBoolean(HIDE_ICON, isHideIcon)
        .putBoolean(LOGGING, isLogging)
        .commit();
}

У вас есть та же проблема в вашем тестовом коде, который можетбыть исправлено так:

@Override
public void onStop() {
    super.onStop();
    SharedPreferences sp = getSharedPreferences("pref", 0);
    sp.edit().putString("setting2", s).commit();
}
1 голос
/ 05 февраля 2013

При чтении данных, доступных для чтения во всем мире, используемых первым приложением, мы должны

заменить

getSharedPreferences("PREF_NAME", Context.MODE_PRIVATE);

на

getSharedPreferences("PREF_NAME", Context.MODE_MULTI_PROCESS);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...