Предпочтение не инициализируется значениями по умолчанию из xml - PullRequest
2 голосов
/ 03 января 2012

Этот вопрос задавался много раз на этом форуме.Но я чувствую, что это все еще нужно очистить для меня.

public class PrefTest extends Activity {
  public Button bt_start= null;
  SharedPreferences mSharedPreferences;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {

    setContentView(R.layout.main);


    bt_start = (Button) findViewById(R.id.button1);
    bt_start.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
      Log.d("TEST","");
      PreferenceManager.setDefaultValues(getApplicationContext(),
                         R.xml.settings_org, true);
      mSharedPreferences = PreferenceManager
        .getDefaultSharedPreferences(getApplicationContext());
      Boolean test = false;
      test = mSharedPreferences.getBoolean("auto_launch_key", true);
      Log.d("TEST","test = "+test);
    }
      });
    super.onCreate(savedInstanceState);
  }

  @Override
  protected void onStart() {
    super.onStart();
  }
}

В коде выше

   Log.d("TEST","test = "+test);

всегда печатает true , хотяустановить значение по умолчанию в xml как ложное (как показано ниже)

 <?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="settings" >
    <CheckBoxPreference android:key="auto_launcvh_key"
        android:summaryOn="..."
        android:summaryOff="---"
        android:title="auto_launch_string" android:defaultValue="false" />
</PreferenceCategory>
 </PreferenceScreen>

Я ожидаю, что setDefaultValues примет значения по умолчанию из XML и инициализирует предпочтение.в моем понимании?

Ответы [ 2 ]

2 голосов
/ 03 января 2012

ОБНОВЛЕНИЕ

При ближайшем рассмотрении я вижу, что вы, вероятно, неправильно получаете объект SharedPreference.хотя я не пробовал, чтобы этот тест работал, я предполагаю, что вам нужно будет вызвать getSharedPreferences (String name, int mode) с именем вашего XML-файла, чтобы получить объект, в котором хранятся значения, определенные в вашем XML-файле.

getDefaultSharedPreferences (Context context) состояния:

Получает экземпляр SharedPreferences, который указывает на файл по умолчанию, который используется инфраструктурой предпочтений в данном контексте.Параметры

context Контекст предпочтений, значения которых требуются.Возвращает

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

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

Обычно способ работы с предпочтениями заключается в создании подкласса PreferenceActivity, который создаст интерфейс настроек, но я ценю, что вы просто пытаетесь написать простой тест.

Также я предполагаю, что CheckBoxPreference android:key="auto_launcvh_key" является опечаткой при написании вопроса.Я думаю, что проверял ключ при первом написании этого ответа, и это было CheckBoxPreference android:key="auto_launch_key"

ОРИГИНАЛ

Во-первых, я бы изменил test = mSharedPreferences.getBoolean("auto_launch_key", true); на test = mSharedPreferences.getBoolean("auto_launch_key", false);, если он сейчасвозвращает false, тогда предпочтения не существует в системе, поэтому существует проблема с вашей средой.Попробуйте очистить проект и переустановить.

Во-вторых, в документации указано:

readAgain - стоит ли перечитывать значения по умолчанию.Примечание: это НЕ сбрасывает настройки обратно к значениям по умолчанию.Для этой функции используйте getDefaultSharedPreferences (Context) и очистите его, а затем вызовите этот метод с этим параметром, установленным в true.

Поэтому, если предпочтение уже существует в системе как истинное, это не будет перезаписыватьи поэтому переустановка должна разобраться и с этим.или вы можете попробовать позвонить clear() на mSharedPreferences и затем позвонить PreferenceManager.setDefaultValues(getApplicationContext(), R.xml.settings_org, true);

Если это не сработает, вы можете опубликовать полный XML.

1 голос
/ 07 ноября 2012

Ответ на самом деле очень прост.Логические значения в файле настроек присутствуют только в том случае, если они истинны, поэтому при чтении логического значения необходимо установить значение по умолчанию, равное false:

test = mSharedPreferences.getBoolean("auto_launch_key", false);

Поэтому, когда предпочтения в xml имеют значение true, они читаются как true, а в противном случаеиспользует по умолчанию getBoolean.Я заметил, что во время отладки нет никаких логических предпочтений со значением false.

...