Как получить SharedPreferences из PreferenceActivity в Android?
Я использую функцию PreferenceActivity, чтобы показать некоторые настройки для моего приложения. Я раздуваю настройки через xml-файл, чтобы мой метод onCreate (и полный class) выглядел следующим образом:
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. Какое имя или как я могу его получить?
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.
Предпочтения – это, как правило, пары значений имени. Они могут храниться как «Общие предпочтения» в различных действиях в приложении (обратите внимание, что в настоящее время они не могут быть разделены между процессами). Или это может быть что-то, что необходимо сохранить для конкретной деятельности.
-
Общие предпочтения. Общие настройки могут использоваться всеми компонентами (действиями, услугами и т. Д.) Приложений.
-
Действия, обработанные обработкой: эти предпочтения могут использоваться только в рамках конкретного вида деятельности и не могут использоваться другими компонентами приложения.
Общие настройки:
getSharedPreferences
настройки управляются с помощью метода getSharedPreferences
classа 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
представляет собой вложенный интерфейс в classе SharedPreference
.
SharedPreferences.Editor editor = preferences.edit(); editor.putInt("storedInt", storedPreference); // value to store editor.commit();
Редактор также поддерживает такие методы, как remove()
и clear()
чтобы удалить значения предпочтений из файла.
Предпочтения деятельности:
Общие предпочтения могут использоваться другими компонентами приложения. Но если вам не нужно делиться предпочтениями с другими компонентами и вы хотите иметь частные настройки активности, вы можете сделать это с помощью метода getPreferences()
активности. Метод getPreference
использует метод getSharedPreferences()
с именем classа активности для имени файла предпочтения.
Ниже приведен код для получения предпочтений
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
. Пакет определяет classы для реализации пользовательского интерфейса приложений.
Чтобы увидеть еще несколько примеров, отметьте запись в хранилище данных Android на сайте разработчиков.
Если у вас нет доступа к getDefaultSharedPreferenes()
, вы можете использовать getSharedPreferences(name, mode)
вместо этого, вам просто нужно передать правильное имя.
Android создает это имя (возможно, на основе имени пакета вашего проекта?). Вы можете получить его, поместив следующий код в onCreate()
и посмотрев, что такое 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); }
Затем назовите это, когда вы хотите поставить 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);
когда мне приходится проходить контекст вокруг, меня действительно раздражает. код становится слишком многословным и неуправляемым. Я делаю это в каждом проекте вместо этого …
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);
если у вас есть флажок, и вы хотите получить его значение, т.е. true / false в любом java-файле –
Use–
Context mContext; boolean checkFlag; checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`