Как да разбера дали са направени промени в предпочитанията?

Имам клас, който разширява 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);
    }
}

person mixkat    schedule 14.02.2011    source източник
comment
Виждам твърде много посоки, в които това може да тръгне в зависимост от общата ви цел. Бихте ли посочили някои подробности за това кога проверявате и с каква цел?   -  person R Hughes    schedule 15.02.2011
comment
@RHughes Просто искам всеки път, когато се направи промяна, да направя нещо... Току-що намерих тази връзка stackoverflow.com/questions/2542938/... Въпреки това все още не мога да го накарам да работи...методът в слушателя никога не се извиква...Някакви идеи?? ?   -  person mixkat    schedule 15.02.2011
comment
Без да гледам кода, мога само да предполагам, че правите същата грешка, която аз винаги правя. Създавам страхотен слушател, след което забравям да го прикрепя към правилния обект. Също така се уверете, че прикачвате слушателя към обекта в метода onCreate() или поне в кода, който изпълнявате, ПРЕДИ да имате нужда от слушателя да слуша.   -  person R Hughes    schedule 15.02.2011
comment
@RHughes Не, прикачвам слушателя към обекта... не знам какво не е наред с него... определено е в процес на създаване... все пак благодаря за отговора...   -  person mixkat    schedule 15.02.2011


Отговори (2)


Do

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. За да получите PreferenceManager, използвайте Activity.getPreferenceManager().

person techiServices    schedule 14.02.2011
comment
@sugarynugs Точно това правя...всъщност копирах кода от тази друга публикация... - person mixkat; 15.02.2011
comment
@sugarynugs listener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { // Implementation } }); prefs.registerOnSharedPreferenceChangeListener(слушател) - person mixkat; 15.02.2011
comment
@sugarynugs listener е екземплярна променлива на този клас..само за да се избегне gc.. - person mixkat; 15.02.2011
comment
къде е декларацията на променливата? Global ли е? Плюс публикуван грешен код... битът вътре в слушателя. - person techiServices; 15.02.2011
comment
Това беше...getDefaultSharedPreferences го поправи....благодаря много приятел... @sugarynugs - person mixkat; 15.02.2011
comment
не забравяйте да ОТМЕНИТЕ РЕГИСТРАЦИЯ слушател с .unregisterOnSharedPreferenceChangeListener !!! - person babay; 28.01.2013
comment
@babay: Просто се чудя дали знаете дали има нужда да се опитвате да дерегистрирате слушателя, ако е внедрен в класа Application? (Да се ​​направи това би било много трудно - класът Application няма методи onStop() или onDestroy().) - person RenniePet; 15.03.2016
comment
@RenniePet, Не, не е нужно да дерегистрирате слушателя на предпочитанията, който е регистриран в клас Application. Например, ако не дерегистрирате слушател в клас Activity, тогава събирачът на боклук няма да освободи памет, разпределена от обект Activity след затваряне на дейността (мениджърът на предпочитанията има препратка към слушател, слушателят има препратка към дейност). Но нямате този случай с Application class. - person babay; 16.03.2016

Във вашия 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
    }

}
person Jonathan    schedule 04.07.2012
comment
Как бихте преработили остарелия ред, който имате във вашия код? addPreferencesFromResource(R.xml.fw_preferences); //deprecated - person mattecalcio; 22.04.2015
comment
@mattecalcio Знам, че закъснях, но ето новия начин за зареждане в xml с настройки: stackoverflow.com/a/13441715/1318194 - person ; 10.05.2015
comment
Добра практика ли е да правите unregisterOnSharedPreferenceChangeListener(this) в onDestroy() на MainActivity? - person Andrii Kovalchuk; 29.08.2016
comment
вашият отговор е страхотен, но също така и документите казват: добавете част за регистриране в автобиографията и добавете част за отмяна на регистрацията в пауза за събирач на боклук. благодаря отново developer.android.com/guide/topics/ui/ - person mehmet; 10.05.2017
comment
Заедно с внедряване на интерфейса OnSharedPreferenceChangeListener и регистриране на слушател на onResume и дерегистриране на onPause - person MRodrigues; 19.12.2017
comment
Не забравяйте да извикате PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this); на onDestroy или имплементирайте като @MRodrigues, поставен по-горе - person Cícero Moura; 28.01.2020