The first header is shown by Prefs1Fragment, which populates itself + * from the following XML resource:
+ * + * {@sample development/samples/ApiDemos/res/xml/fragmented_preferences.xml preferences} + * + *Note that this XML resource contains a preference screen holding another + * fragment, the Prefs1FragmentInner implemented here. This allows the user + * to traverse down a hierarchy of preferences; pressing back will pop each + * fragment off the stack to return to the previous preferences. + * + *
See {@link PreferenceFragment} for information on implementing the * fragments themselves. */ public abstract class PreferenceActivity extends ListActivity implements - PreferenceManager.OnPreferenceTreeClickListener { + PreferenceManager.OnPreferenceTreeClickListener, + PreferenceFragment.OnPreferenceStartFragmentCallback { private static final String TAG = "PreferenceActivity"; private static final String PREFERENCES_TAG = "android:preferences"; @@ -106,6 +117,8 @@ public abstract class PreferenceActivity extends ListActivity implements private static final String EXTRA_PREFS_NO_HEADERS = ":android:no_headers"; + private static final String BACK_STACK_PREFS = ":android:prefs"; + // extras that allow any preference activity to be launched as part of a wizard // show Back and Next buttons? takes boolean parameter @@ -206,16 +219,19 @@ public abstract class PreferenceActivity extends ListActivity implements public static class Header { /** * Title of the header that is shown to the user. + * @attr ref android.R.styleable#PreferenceHeader_title */ CharSequence title; /** * Optional summary describing what this header controls. + * @attr ref android.R.styleable#PreferenceHeader_summary */ CharSequence summary; /** * Optional icon resource to show for this header. + * @attr ref android.R.styleable#PreferenceHeader_icon */ int iconRes; @@ -228,6 +244,7 @@ public abstract class PreferenceActivity extends ListActivity implements /** * Full class name of the fragment to display when this header is * selected. + * @attr ref android.R.styleable#PreferenceHeader_fragment */ String fragment; } @@ -551,6 +568,8 @@ public abstract class PreferenceActivity extends ListActivity implements * @param fragmentName The name of the fragment to display. */ public void switchToHeader(String fragmentName) { + popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE); + Fragment f; try { f = Fragment.instantiate(this, fragmentName); @@ -561,6 +580,20 @@ public abstract class PreferenceActivity extends ListActivity implements openFragmentTransaction().replace(com.android.internal.R.id.prefs, f).commit(); } + @Override + public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) { + Fragment f; + try { + f = Fragment.instantiate(this, pref.getFragment()); + } catch (Exception e) { + Log.w(TAG, "Failure instantiating fragment " + pref.getFragment(), e); + return false; + } + openFragmentTransaction().replace(com.android.internal.R.id.prefs, f) + .addToBackStack(BACK_STACK_PREFS).commit(); + return true; + } + /** * Posts a message to bind the preferences to the list view. *
diff --git a/core/java/android/preference/PreferenceFragment.java b/core/java/android/preference/PreferenceFragment.java
index ac6157490117d..a5395e23568f9 100644
--- a/core/java/android/preference/PreferenceFragment.java
+++ b/core/java/android/preference/PreferenceFragment.java
@@ -125,6 +125,21 @@ public abstract class PreferenceFragment extends Fragment implements
}
};
+ /**
+ * Interface that PreferenceFragment's containing activity should
+ * implement to be able to process preference items that wish to
+ * switch to a new fragment.
+ */
+ public interface OnPreferenceStartFragmentCallback {
+ /**
+ * Called when the user has clicked on a Preference that has
+ * a fragment class name associated with it. The implementation
+ * to should instantiate and switch to an instance of the given
+ * fragment.
+ */
+ boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);
+ }
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -167,6 +182,13 @@ public abstract class PreferenceFragment extends Fragment implements
mPreferenceManager.dispatchActivityStop();
}
+ @Override
+ public void onDestroyView() {
+ mList = null;
+ mHandler.removeCallbacks(mRequestFocus);
+ super.onDestroyView();
+ }
+
@Override
public void onDestroy() {
super.onDestroy();
@@ -251,7 +273,13 @@ public abstract class PreferenceFragment extends Fragment implements
/**
* {@inheritDoc}
*/
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+ Preference preference) {
+ if (preference.getFragment() != null &&
+ getActivity() instanceof OnPreferenceStartFragmentCallback) {
+ return ((OnPreferenceStartFragmentCallback)getActivity()).onPreferenceStartFragment(
+ this, preference);
+ }
return false;
}
diff --git a/core/java/android/preference/PreferenceScreen.java b/core/java/android/preference/PreferenceScreen.java
index 95e54324f4458..f34f4a31a220a 100644
--- a/core/java/android/preference/PreferenceScreen.java
+++ b/core/java/android/preference/PreferenceScreen.java
@@ -136,7 +136,7 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi
@Override
protected void onClick() {
- if (getIntent() != null || getPreferenceCount() == 0) {
+ if (getIntent() != null || getFragment() != null || getPreferenceCount() == 0) {
return;
}
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 728f99912c153..97c58226b16cd 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3457,6 +3457,9 @@