Як отримати спільні налаштування від 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 на сайті розробників.


55
+1: u врятував мені день .. жоден підручник / приклад в Інтернеті про це не говорить. все, що вони говорять про інші функції та налаштування, але не про те, як їх читати.
ankitjaininfo

1
Дивіться моє оновлення відповіді, а ім'я файлу - це щось на кшталт, package.prefsале я не впевнений.
Pentium10

1
Дякуємо за код. Є лише одна дрібниця, яка мене бентежить: SharedPreference - це інтерфейс, тож де реалізований власне код, який обробляє будь-які виклики методу?
x1886x

1
Бажаю, я прочитав це за тиждень до того, як витрачати час на читання дурних відповідей / коментарів дурнів у всьому СІ, які думають, що знають, коли насправді ні. Дякую @ Pentium10, чи є у тебе блог, ще раз дякую, дуже вдячний :)
Sanjeevcn

1
Замість використання editor.commit () ви також можете скористатися editor.apply (). Різниця полягає в тому, що commit () записує ваші зміни синхронно, а застосувати записує їх асинхронно. Це робить ваш інтерфейс швидше.
Хашим Ахтар

29

Якщо у вас немає доступу getDefaultSharedPreferenes(), ви можете скористатися getSharedPreferences(name, mode)натомість, вам просто потрібно ввести правильне ім’я.

Android створює це ім’я (можливо, виходячи з назви пакета вашого проекту?). Ви можете отримати його, помістивши в код наступний код SettingsActivity onCreate()і побачивши, що preferencesNameтаке.

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

Рядок повинен бути чимось на кшталт com.example.projectname_preferences. Жорсткий код, який знаходиться десь у вашому проекті, і передайте його, getSharedPreferences()і вам слід добре піти.


1
Джерело для діяльності читає: public SharedPreferences getPreferences (режим int) {return getSharedPreferences (getLocalClassName (), режим); }
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
Будь ласка, для любові до Бога ніколи не використовуйте Діяльність як глобальний контекст. Якщо вам потрібно використовувати глобальний контекст, будь ласка, зробіть це за допомогою користувацького класу додатків.
Торбен

1
@Thorben Погодився. Або простоgetApplicationContext()
OneCricketeer

3

якщо у вас є прапорець, і ви хочете отримати його значення, тобто true / false у будь-якому файлі Java--

Використовуйте--

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.