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

Я использую функцию 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. Какое имя или как я могу его получить?

Ответ 1

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

Обновить

Согласно общим предпочтениям | Android Developer Tutorial (часть 13) от Sai Geetha MN,

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

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

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

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

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

getSharedPreferences настройки управляются с помощью метода 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 объект 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 на сайте разработчиков.

Ответ 2

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

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

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

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

Ответ 3

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

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);
}

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

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);

Ответ 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);

Ответ 5

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

Использование -

Context mContext;
boolean checkFlag;

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

Ответ 6

Обновлено 2019

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

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

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

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

PowerPreference.getDefaultFile()

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

PowerPreference.getFileByName(fileName)

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

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

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

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