Add Preference.onDetached to match Preference.onAttached
Also move onAttached/binding of preferences to happen in onViewCreated
Change-Id: Iee519d323bc60b57df857ed98a4a6df9f43ce45e
diff --git a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
index d1a0697..bbece7c 100644
--- a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
+++ b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
@@ -318,14 +318,19 @@
}
@Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
if (mHavePrefs) {
bindPreferences();
}
mInitDone = true;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
Bundle container = savedInstanceState.getBundle(PREFERENCES_TAG);
@@ -354,9 +359,12 @@
@Override
public void onDestroyView() {
- mList = null;
mHandler.removeCallbacks(mRequestFocus);
mHandler.removeMessages(MSG_BIND_PREFERENCES);
+ if (mHavePrefs) {
+ unbindPreferences();
+ }
+ mList = null;
super.onDestroyView();
}
@@ -523,6 +531,15 @@
onBindPreferences();
}
+ private void unbindPreferences() {
+ final PreferenceScreen preferenceScreen = getPreferenceScreen();
+ if (preferenceScreen != null) {
+ preferenceScreen.onDetached();
+ getListView().setAdapter(null);
+ }
+ onUnbindPreferences();
+ }
+
/** @hide */
protected void onBindPreferences() {
}
diff --git a/v7/preference/api/current.txt b/v7/preference/api/current.txt
index c2e3255..5e0c104 100644
--- a/v7/preference/api/current.txt
+++ b/v7/preference/api/current.txt
@@ -122,6 +122,7 @@
method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
method protected void onClick();
method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
+ method public void onDetached();
method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
method public void onParentChanged(android.support.v7.preference.Preference, boolean);
method protected void onPrepareForRemoval();
diff --git a/v7/preference/src/android/support/v7/preference/Preference.java b/v7/preference/src/android/support/v7/preference/Preference.java
index 84550cf..2f320de 100644
--- a/v7/preference/src/android/support/v7/preference/Preference.java
+++ b/v7/preference/src/android/support/v7/preference/Preference.java
@@ -1087,6 +1087,16 @@
registerDependency();
}
+ /**
+ * Called when the Preference hierarchy has been detached from the
+ * list of preferences. This can also be called when this
+ * Preference has been removed from a group that was attached
+ * to the list of preferences.
+ */
+ public void onDetached() {
+ unregisterDependency();
+ }
+
private void registerDependency() {
if (TextUtils.isEmpty(mDependencyKey)) return;
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
index 368a3a4..802fdb6 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
@@ -309,14 +309,19 @@
}
@Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
if (mHavePrefs) {
bindPreferences();
}
mInitDone = true;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
Bundle container = savedInstanceState.getBundle(PREFERENCES_TAG);
@@ -345,9 +350,12 @@
@Override
public void onDestroyView() {
- mList = null;
mHandler.removeCallbacks(mRequestFocus);
mHandler.removeMessages(MSG_BIND_PREFERENCES);
+ if (mHavePrefs) {
+ unbindPreferences();
+ }
+ mList = null;
super.onDestroyView();
}
@@ -514,6 +522,15 @@
onBindPreferences();
}
+ private void unbindPreferences() {
+ final PreferenceScreen preferenceScreen = getPreferenceScreen();
+ if (preferenceScreen != null) {
+ preferenceScreen.onDetached();
+ getListView().setAdapter(null);
+ }
+ onUnbindPreferences();
+ }
+
/** @hide */
protected void onBindPreferences() {
}
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceGroup.java b/v7/preference/src/android/support/v7/preference/PreferenceGroup.java
index 968b777..b10f85b 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceGroup.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceGroup.java
@@ -192,7 +192,11 @@
private boolean removePreferenceInt(Preference preference) {
synchronized(this) {
preference.onPrepareForRemoval();
- return mPreferenceList.remove(preference);
+ boolean success = mPreferenceList.remove(preference);
+ if (success) {
+ preference.onDetached();
+ }
+ return success;
}
}
@@ -285,11 +289,17 @@
}
@Override
- protected void onPrepareForRemoval() {
- super.onPrepareForRemoval();
+ public void onDetached() {
+ super.onDetached();
// We won't be attached to the activity anymore
mAttachedToHierarchy = false;
+
+ // Dispatch to all contained preferences
+ final int preferenceCount = getPreferenceCount();
+ for (int i = 0; i < preferenceCount; i++) {
+ getPreference(i).onDetached();
+ }
}
@Override
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceManager.java b/v7/preference/src/android/support/v7/preference/PreferenceManager.java
index 0c3e65f..1c460a1 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceManager.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceManager.java
@@ -238,6 +238,9 @@
*/
public boolean setPreferences(PreferenceScreen preferenceScreen) {
if (preferenceScreen != mPreferenceScreen) {
+ if (mPreferenceScreen != null) {
+ mPreferenceScreen.onDetached();
+ }
mPreferenceScreen = preferenceScreen;
return true;
}