Як виявити, чи були внесені зміни до уподобань?


76

У мене є клас, який розширює PreferenceActivity і показує екран налаштувань мого додатка. Чи можна перевірити, чи не було внесено змін до уподобань?

Це допомагає ...

http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html

Інша відповідна публікація: SharedPreferences.onSharedPreferenceChangeListener не викликається послідовно


public class PreferenceClass extends PreferenceActivity {

    OnSharedPreferenceChangeListener listener;

    public void onCreate(Bundle savedInstanceState) {
        SharedPreferences prefs = this.getSharedPreferences("settings", 0);
        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {

            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                int flag = 1;
            }
        };
        prefs.registerOnSharedPreferenceChangeListener(listener);
        super.onCreate(null);
        addPreferencesFromResource(R.xml.settings);
    }
}

Я бачу занадто багато напрямків, які це може піти, залежно від вашої загальної мети. Чи не могли б Ви викласти деякі особливості щодо того, коли Ви перевіряєте, і до чого?
R Hughes

@RHughes Я просто хочу, щоб щоразу, коли вносяться зміни, щоб щось зробити ... Просто знайшов це посилання stackoverflow.com/questions/2542938/ ... ... Хоча все одно не можу змусити його працювати ... метод у слухачі ніколи не викликається ... Будь-які ідеї ???
mixkat

Не дивлячись на код, я можу лише здогадуватися, що ви робите ту саму помилку, яку я, здається, завжди роблю. Я будую чудового слухача, а потім забуваю прикріпити його до потрібного об’єкта. Крім того, переконайтеся, що ви приєднуєте слухач до об’єкта за допомогою методу onCreate () або принаймні в коді, який ви запускаєте ДО того, як вам насправді потрібно, щоб слухач слухав.
R Hughes

@RHughes Ні, я не приєдную слухача до об'єкта ... не знаю, що з ним не так ... його точно створено ... у будь-якому випадку дякую за відповідь ...
mixkat

Відповіді:


67

Роби

SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
                           SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        // your stuff here
    }
};

У вашому PreferenceActivity, тобто зробіть його членом вашого PreferenceActivityкласу, а потім зробіть registerOnSharedPreferenceChangeListener(spChanged)у PreferenceActivity.onCreate()методі.

Це те, що я роблю, і у мене ніколи не виникає проблем.

В іншому випадку винна ваша умовна перевірка в слухачі. Опублікуйте код.

РЕДАГУВАТИ:

З коду, який ви опублікували, ви повинні створити prefsзмінну члена класу, щоб вона мала глобальний обсяг.

І зробіть це prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());замість того, getSharedPreferencesщо ви не створили цей файл.

Для створення файлу потрібно скористатися PreferenceManager. Щоб отримати a PreferenceManager, використовуйте Activity.getPreferenceManager().


@sugarynugs Це саме те, що я роблю ... насправді я скопіював код з цього іншого допису ...
mixkat

@sugarynugs listener = new SharedPreferences.OnSharedPreferenceChangeListener () {public void onSharedPreferenceChanged (SharedPreferences prefs, String key) {// Реалізація}}); prefs.registerOnSharedPreferenceChangeListener (слухач)
mixkat

1
Прослуховувач @sugarynugs - це змінна екземпляра цього класу .. лише щоб уникнути його gc ..
mixkat

1
де декларація змінної? Це Global? Плюс неправильний код розміщений ... біт всередині слухача.
techiServices

1
@RenniePet, Ні, вам не потрібно скасовувати реєстрацію налаштувань слухача, який зареєстрований у класі Application. Наприклад, якщо ви не скасуєте реєстрацію слухача в класі Activity, тоді збирач сміття не звільняє пам’ять, виділену об’єктом Activity після закриття діяльності (менеджер налаштувань має посилання на слухача, слухач - посилання на активність). Але у вас цього немає з класом Application.
babay

67

У своєму PreferenceActivityкласі впроваджуйте SharedPreferences.OnSharedPreferenceChangeListenerінтерфейс. Додайте необхідний onSharedPreferenceChangedметод до свого класу та зареєструйте його в onCreate.

Див. Зразок коду тут:

public class MyPreferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.fw_preferences); //deprecated
        PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // handle the preference change here
    }

}

1
Як би ви переформатували застарілий рядок, який є у вашому коді? addPreferencesFromResource(R.xml.fw_preferences); //deprecated
mattecalcio

1
@mattecalcio Я знаю , що я запізнилася , але ось новий спосіб завантаження в XML настройки: stackoverflow.com/a/13441715/1318194

2
Це хороша практика робити unregisterOnSharedPreferenceChangeListener (this) у onDestroy () of MainActivity?
Андрій Ковальчук

1
ваша відповідь чудова, але також у документах сказано: додайте частину реєстрації у резюме та додайте незареєстровану частину в паузі для колектора сміття. ще раз спасибі developer.android.com/guide/topics/ui/…
mehmet

Разом із реалізацією інтерфейсу OnSharedPreferenceChangeListenerта реєстрацією прослуховувача onResumeта скасуванням реєстраціїonPause
MRodrigues
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.