Не удается получить доступ к настройкам, созданным PreferenceActivity - PullRequest
3 голосов
/ 17 августа 2010

У меня есть минимальная программа, которая делает чуть больше, чем позволяет мне установить два предпочтения (int и String) с помощью Android PreferenceActivity.Итак, у меня есть XML-файл, который определяет мои предпочтения, и действие, которое распространяется на PreferenceActivity.У моего основного действия есть меню опций, которое запускает мое предпочтительное действие.Все это прекрасно работает.Я могу установить свои предпочтения, и значения будут сохраняться во время и после выполнения моей программы.

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

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int intSetting = prefs.getInt("intSetting", 0);
String strSetting = prefs.getString("strSetting", "");

Проблема в том, что если я прервусь при вызове getInt() и перешагну, мой стек будет выглядеть следующим образом, и приложение будет аварийно завершаться, если я продолжу:

Тема [<3> main] (приостановлено)
ActivityThread.performLaunchActivity (ActivityThread $ ActivityRecord, Intent) строка: 2494
ActivityThread.handleLaunchActivity (ActivityThread $ ActivityRecord, Intent) строка: 2512
ActivityThread.access $ 2200 (ActivityThread, ActivityThread $ ActivityRecord, Intent) строка: 119
ActivityThread $ H.handleMessage (Сообщение) строка: 1863
ActivityThread $ H (Обработчик) .dispatchMessage (Сообщение) строка: 99 Looper.loop () строка: 123
ActivityThread.main (String []) строка: 4363 Method.invokeNative (Object, Object [], Class, Class [], Class, int, boolean) строка: недоступно[собственный метод] Method.invoke (Object, Object ...) строка: 521
ZygoteInit $ MethodAndArgsCaller.run () строка: 860 ZygoteInit.main (String []) строка: 618 NativeStart.main (String [])линия: безрезультатноable [нативный метод]

Я пробовал варианты параметров, передаваемых getDefaultSharedPreferences (), в том числе:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

... и, возможно, некоторые другие в другом контексте (то есть, когда я получаю доступ к предпочтениям из моего основного занятия по сравнению с другим занятием против некоторой функции в классе, которая не является занятием.Результат всегда один и тот же.

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

Ответы [ 3 ]

7 голосов
/ 17 августа 2010

Вы не показываете трассировку стека. Thread [<3> main] (Suspended) - бесполезный вывод из Eclipse. Вам необходимо изучить реальную трассировку стека, которую вы должны получить, разрешив Android перейти в диалоговое окно «Принудительное закрытие», а затем посмотреть на LogCat (в вашей перспективе DDMS) для трассировки стека.

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

Ваш способ доступа к значению по умолчанию SharedPreferences (с использованием this) является правильным и не нуждается в изменении.

Вот пример проекта , показывающий использование PreferenceActivity и возвращающий SharedPreferences обратно.

0 голосов
/ 17 августа 2010

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

0 голосов
/ 17 августа 2010

Просто чтобы убедиться:

  • В вас AndroidManifest у вас должен быть Activity, который расширяет PreferenceActivity примерно так:

    <активностьandroid: name = ". Activities.Preferences" android: label = "@ string / app_name" />

  • Activity, который расширяет PreferenceActivity, должен иметь следующий код:

    @ Переопределить защищенный void onCreate (Bundle SavedInstanceState) {super.onCreate (saveInstanceState);addPreferencesFromResource (R.layout.prefs);}

где R.layout.prefs - это xml ваших предпочтений.

Если вы сделали обе вещи, отредактируйте ваш вопрос с помощью xml, который вы используете, чтобы ppl мог воспроизвестиВаша проблема.

...