Как получить SharedPreferences из PreferenceActivity в Android?


373

Я использую PreferenceActivity, чтобы показать некоторые настройки для моего приложения. Я надуваю настройки через xml-файл, чтобы мой onCreate (и полные методы класса) выглядели так:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

Javadoc PreferenceActivity PreferenceFragment утверждает, что

Эти настройки будут автоматически сохраняться в SharedPreferences, когда пользователь взаимодействует с ними. Чтобы получить экземпляр SharedPreferences, который будет использовать иерархия предпочтений в этом действии, вызовите getDefaultSharedPreferences (android.content.Context) с контекстом в том же пакете, что и это действие.

Но как я могу получить имя SharedPreference в другом действии? Я могу только позвонить

getSharedPreferences(name, mode)

в другом действии, но мне нужно имя SharedPreference, которое использовалось PreferenceActivity. Какое имя или как я могу получить его?

Ответы:


721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

Обновить

Согласно общим настройкам | Учебник для разработчиков Android (часть 13) Сай Гита М.Н.,

Многие приложения могут предоставлять способ захвата пользовательских настроек в настройках конкретного приложения или действия. Для поддержки этого Android предоставляет простой набор API.

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

  1. Общие предпочтения. Общие предпочтения могут использоваться всеми компонентами (действиями, службами и т. Д.) Приложений.

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

Общие настройки:

Общие предпочтения управляются с помощью getSharedPreferencesметода Contextкласса. Предпочтения хранятся в файле по умолчанию (1), или вы можете указать имя файла (2), которое будет использоваться для обращения к предпочтениям.

(1) Рекомендуется использовать режим по умолчанию без указания имени файла.

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Вот как вы получаете экземпляр при указании имени файла

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATEрежим работы для предпочтений. Это режим по умолчанию и означает, что созданный файл будет доступен только вызывающему приложению. Поддерживаются два других режима: MODE_WORLD_READABLEи MODE_WORLD_WRITEABLE. В MODE_WORLD_READABLEдругом приложении может прочитать созданный файл, но не может изменить его. В случае MODE_WORLD_WRITEABLEдругих приложений также есть права на запись для созданного файла.

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

int storedPreference = preferences.getInt("storedInt", 0);

Для хранения значений в файле настроек SharedPreference.Editorдолжен использоваться объект. Editorявляется вложенным интерфейсом в SharedPreferenceклассе

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Редактор также поддерживает такие методы, как remove()и clear()для удаления значений предпочтений из файла.

Настройки деятельности:

Общие настройки могут использоваться другими компонентами приложения. Но если вам не нужно делиться настройками с другими компонентами и вы хотите иметь личные настройки активности, вы можете сделать это с помощью getPreferences()метода действия. getPreferenceМетод использует getSharedPreferences()метод с именем класса активности для имени файла предпочтений.

Ниже приведен код для получения настроек

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

Код для хранения значений такой же, как и в случае общих настроек.

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Вы также можете использовать другие методы, такие как сохранение состояния активности в базе данных. Примечание Android также содержит пакет под названием android.preference. Пакет определяет классы для реализации пользовательского интерфейса настроек приложения.

Чтобы увидеть еще несколько примеров, проверьте публикацию Android Data Storage на сайте разработчиков.


55
+1: ты спас мой день .. ни один из уроков / примеров в интернете не говорит об этом. все они говорят об особенностях и настройках, но не о том, как их читать.
ankitjaininfo

1
Смотрите мое обновление ответа, и имя файла что-то вроде, package.prefsно я не уверен.
Pentium10

1
Спасибо за код. Меня смущает лишь одна маленькая вещь: SharedPreference - это интерфейс, так где же реализован реальный код, который обрабатывает любые вызовы методов?
x1886x

1
Жаль, что я прочитал это за неделю до того, как потратил свое время на чтение некоторых глупых ответов / комментариев ботаников по всей SE, которые думают, что знают, когда на самом деле этого не делают .. Спасибо @ Pentium10, у вас есть какой-нибудь блог, еще раз спасибо, действительно ценю это :)
Sanjeevcn

1
Вместо использования editor.commit () вы также можете использовать editor.apply (). Разница в том, что commit () записывает ваши изменения синхронно, а apply записывает их асинхронно. Это делает ваш интерфейс быстрее.
Хашим Ахтар

29

Если у вас нет доступа getDefaultSharedPreferenes(), вы можете использовать getSharedPreferences(name, mode)вместо этого, вам просто нужно ввести правильное имя.

Android создает это имя (возможно, на основе имени пакета вашего проекта?). Вы можете получить его, поместив следующий код в a SettingsActivity onCreate()и посмотрев, что preferencesNameесть.

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

Строка должна быть что-то вроде com.example.projectname_preferences. Жесткий код, который где-то в вашем проекте, и передать его, getSharedPreferences()и вы должны быть в порядке.


1
Источник для активности читает: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize

22

Сначала объявите эти методы.

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

Затем вызывайте это, когда хотите поставить преф:

putPref("myKey", "mystring", getApplicationContext());

звоните, когда хотите получить преф:

getPref("myKey", getApplicationContext());

Или вы можете использовать этот объект https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo, который еще больше упрощает все

Пример:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);

Почему бы не использовать editor.apply (); вместо коммита для обработки в фоновом режиме
Ави Паршан

4

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

public class global {
    public static Activity globalContext = null;

и установить его в основной деятельности создать

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

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

getText(R.string.yourPrefKeyName).toString()

теперь назовите это очень просто, как это в одной строке кода

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);

4
В чем преимущество независимости ключей? Они никогда не показываются пользователю, верно?
Герд

1
Пожалуйста, ради любви к Богу, никогда не используйте Деятельность как глобальный Контекст. Если вам нужно использовать глобальный контекст, то, пожалуйста, сделайте это с помощью пользовательского класса Application.
Торбен

1
@ Торбен Согласен. Или простоgetApplicationContext()
OneCricketeer

3

если у вас есть флажок, и вы хотите получить его значение, то есть истина / ложь в любом файле Java -

Use--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`

0

Обновлено 2019

Вы можете просто использовать PowerPreferenceбиблиотеку

https://github.com/AliEsaAssadi/Android-Power-Preference

Получение экземпляра общего предпочтения

Чтобы получить экземпляр по умолчанию, вам просто нужно позвонить

PowerPreference.getDefaultFile()

Или, если вы хотите конкретный файл настроек

PowerPreference.getFileByName(fileName)

Запись данных:

PowerPreference.getDefaultFile().put(key,value)

Получение данных

PowerPreference.getDefaultFile().getString(key,value)

Как PowerPreference обрабатывает контекстную часть? Контекст необходим для чтения общих префов, нет? Я новичок в Android и пытаюсь понять.
Йети

0

Попробуйте следующий исходный код, он работал для меня

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.