Как я могу получить 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. Какое имя или как я могу получить его?

6 ответов

Решение
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 на сайте разработчиков.

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

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

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

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

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

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

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

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

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

Use--

Context mContext;
boolean checkFlag;

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

ОБНОВЛЕНИЕ 2018:

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

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

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

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

PowerPreference.defult()

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

PowerPreference.name(fileName)

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

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

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

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

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

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Другие вопросы по тегам