diff --git a/api/current.txt b/api/current.txt index 270a3a505a6dd..0e8155f3dc6bf 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23885,6 +23885,7 @@ package android.preference { method protected void onClick(); method protected android.view.View onCreateView(android.view.ViewGroup); method public void onDependencyChanged(android.preference.Preference, boolean); + method protected void onDetachedFromActivity(); method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int); method public void onParentChanged(android.preference.Preference, boolean); method protected void onPrepareForRemoval(); diff --git a/api/system-current.txt b/api/system-current.txt index 35c8db7650ba7..ec92700d327e3 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -25841,6 +25841,7 @@ package android.preference { method protected void onClick(); method protected android.view.View onCreateView(android.view.ViewGroup); method public void onDependencyChanged(android.preference.Preference, boolean); + method protected void onDetachedFromActivity(); method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int); method public void onParentChanged(android.preference.Preference, boolean); method protected void onPrepareForRemoval(); diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java index 3b482eb5a9b53..5d64af577cba6 100644 --- a/core/java/android/preference/Preference.java +++ b/core/java/android/preference/Preference.java @@ -1184,9 +1184,10 @@ public class Preference implements Comparable { /** * Called when the Preference hierarchy has been attached to the - * {@link PreferenceActivity}. This can also be called when this - * Preference has been attached to a group that was already attached - * to the {@link PreferenceActivity}. + * {@link PreferenceActivity} or {@link PreferenceFragment}. This can + * also be called when this Preference has been attached to a group + * that was already attached to the {@link PreferenceActivity} or + * {@link PreferenceFragment}. */ protected void onAttachedToActivity() { // At this point, the hierarchy that this preference is in is connected @@ -1194,6 +1195,16 @@ public class Preference implements Comparable { registerDependency(); } + /** + * Called when the Preference hierarchy has been detached from the + * {@link PreferenceActivity} or {@link PreferenceFragment}. This can + * also be called when this Preference has been removed from a group + * that was already attached to the {@link PreferenceActivity} or + * {@link PreferenceFragment}. + */ + protected void onDetachedFromActivity() { + } + private void registerDependency() { if (TextUtils.isEmpty(mDependencyKey)) return; diff --git a/core/java/android/preference/PreferenceGroup.java b/core/java/android/preference/PreferenceGroup.java index 5e84086531450..d6e9e61f358b3 100644 --- a/core/java/android/preference/PreferenceGroup.java +++ b/core/java/android/preference/PreferenceGroup.java @@ -187,7 +187,11 @@ public abstract class PreferenceGroup extends Preference implements GenericInfla private boolean removePreferenceInt(Preference preference) { synchronized(this) { preference.onPrepareForRemoval(); - return mPreferenceList.remove(preference); + boolean success = mPreferenceList.remove(preference); + if (mAttachedToActivity) { + preference.onDetachedFromActivity(); + } + return success; } } @@ -263,7 +267,7 @@ public abstract class PreferenceGroup extends Preference implements GenericInfla protected boolean isOnSameScreenAsChildren() { return true; } - + @Override protected void onAttachedToActivity() { super.onAttachedToActivity(); @@ -280,11 +284,17 @@ public abstract class PreferenceGroup extends Preference implements GenericInfla } @Override - protected void onPrepareForRemoval() { - super.onPrepareForRemoval(); - + protected void onDetachedFromActivity() { + super.onDetachedFromActivity(); + // We won't be attached to the activity anymore mAttachedToActivity = false; + + // Dispatch to all contained preferences + final int preferenceCount = getPreferenceCount(); + for (int i = 0; i < preferenceCount; i++) { + getPreference(i).onDetachedFromActivity(); + } } @Override diff --git a/core/java/android/preference/PreferenceManager.java b/core/java/android/preference/PreferenceManager.java index 55ee77a7d8c03..4e4b1c90eca98 100644 --- a/core/java/android/preference/PreferenceManager.java +++ b/core/java/android/preference/PreferenceManager.java @@ -396,6 +396,9 @@ public class PreferenceManager { */ boolean setPreferences(PreferenceScreen preferenceScreen) { if (preferenceScreen != mPreferenceScreen) { + if (mPreferenceScreen != null) { + mPreferenceScreen.onDetachedFromActivity(); + } mPreferenceScreen = preferenceScreen; return true; } @@ -704,7 +707,11 @@ public class PreferenceManager { */ void dispatchActivityDestroy() { List list = null; - + + if (mPreferenceScreen != null) { + mPreferenceScreen.onDetachedFromActivity(); + mPreferenceScreen = null; + } synchronized (this) { if (mActivityDestroyListeners != null) { list = new ArrayList(mActivityDestroyListeners);