Как мне получить 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.Контекст) с контекстом в том же пакете, что и это действие.
Но как я получу имя SharedPreference в другом Activity? Я могу только вызвать
getSharedPreferences(name, mode)
в другом действии, но мне нужно имя SharedPreference, которое использовалось PreferenceActivity . Что это за имя или как я могу его получить?
Переведено автоматически
Ответ 1
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);
Обновить
В соответствии с общими настройками | Руководство для разработчиков Android (часть 13) от Sai Geetha M N,
Многие приложения могут предоставлять способ фиксировать пользовательские предпочтения в настройках конкретного приложения или действия. Для поддержки этого Android предоставляет простой набор API.
Предпочтения обычно представляют собой пары имя-значение. Они могут храниться как “Общие предпочтения” для различных действий в приложении (обратите внимание, что в настоящее время они не могут быть общими для всех процессов). Или это может быть что-то, что необходимо сохранить для конкретного действия.
Общие настройки: общие настройки могут использоваться всеми компонентами (действиями, службами и т.д.) приложений.
Настройки, обрабатываемые активностью: эти настройки могут использоваться только в рамках определенного действия и не могут использоваться другими компонентами приложения.
Общие настройки:
Общими настройками управляют с помощью 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
другие приложения также имеют права на запись для созданного файла.
Наконец, когда у вас есть экземпляр preferences, вот как вы можете извлечь сохраненные значения из preferences:
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()
, для удаления значений предпочтений из файла.
Настройки активности:
Общие настройки могут использоваться другими компонентами приложения. Но если вам не нужно делиться настройками с другими компонентами и вы хотите иметь личные настройки activity, вы можете сделать это с помощью getPreferences()
метода activity. В getPreference
методе используется getSharedPreferences()
метод с именем класса activity в качестве имени файла предпочтений.
Ниже приведен код для получения настроек
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 о хранилище данных на сайте разработчиков.
Ответ 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());
вызывайте это, когда хотите получить pref:
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;
и установить его в основном действии create
@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);