доступ к классу из другого действия

Имейте следующую настройку:

Класс MainActivity — расширяет активность

Класс MyLayout — расширяет представление

Класс Prefs — расширяет PreferenceActivity и реализует OnSharedPreferenceChangeListener.

MainActivity создает класс MyLayout и устанавливает его в качестве своего содержимого. Как только пользователь нажимает на меню, запускается класс Prefs, где пользователь может изменить некоторые настройки.

Я хочу, чтобы после того, как пользователь изменит настройку, был вызван перегруженный метод OnsharedPreferenceChanged в классе Prefs, и оттуда я хотел бы вызвать общедоступные методы в классе MyLayout, созданном в MainActivity.

Как я могу это сделать?


person Milan    schedule 22.08.2010    source источник


Ответы (2)


Не перегружайте метод onSharedPreferenceChanged в PreferenceActivity. Получите экземпляр общего предпочтения в вашей MainActivity, а затем зарегистрируйте onsharedpreferencechangedlistener внутри вашей основной активности.



SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);

pref.registerOnSharedPreferenceChangeListener(prefListener);

И затем вы можете создать новый прослушиватель предпочтений


    OnSharedPreferenceChangeListener prefListener = new OnSharedPreferenceChangeListener() {

        @Override
        public void onSharedPreferenceChanged(
                SharedPreferences sharedPreferences, String key) {
            // Do stuff
        }

    };

Вы также должны отменить регистрацию слушателя в onPause(), если вам не нужно, чтобы он сохранялся, в противном случае отмените его регистрацию в onStop().

person Falmarri    schedule 22.08.2010
comment
Изменил, как было предложено, и это работает, но только один раз. Как только я пытаюсь снова войти в меню и изменить значения, onsharedpreferencechanged снова не вызывается. Пытался отменить регистрацию слушателя, но это только заставило его вообще не работать. Я предполагаю, что слушатель ломается после первого доступа к меню, и я понятия не имею, почему. - person Milan; 22.08.2010
comment
Вышеупомянутая проблема, похоже, устранена после перезапуска и очистки eclipse. - person Milan; 22.08.2010
comment
Да, прослушиватель предпочтений не потребляется, так что, должно быть, это была какая-то другая странная проблема. - person Falmarri; 23.08.2010

Попробуйте заставить MainActivity реализовать OnSharedPreferenceChangeListener и зарегистрировать его в методе onCreate(), как сказал Фалмарри.

person Macarse    schedule 22.08.2010
comment
Я бы рекомендовал не реализовывать onSharedPreferenceChangeListener в классе Activity. Вместо этого просто создайте новый именованный экземпляр onSharedPreferenceListener. - person Falmarri; 23.08.2010
comment
Почему вы не рекомендуете это делать? - person HXCaine; 23.08.2010
comment
Потому что это добавляет сложности и нарушает некоторые принципы объектно-ориентированного подхода. Ваша активность не должна реализовывать интерфейс, если в этом нет необходимости. Смысл наличия классов и объектов в максимально возможном разделении реализации. Реализация интерфейсов в классах, где это не требуется, только усложняет - person Falmarri; 24.08.2010