I have a PreferenceActivity with several fragments:
R.xml.preferences: (shortened for better readability):
Or use PreferenceActivity.switchToHeader. When starting the PreferenceActivity, the header/overview of all settings pages is loaded first and then the fragment. When finishing the fragment, you will return to the overview.
MyPreferenceActivity:
@Override
public void onBuildHeaders(List headers) {
loadHeadersFromResource(R.xml.preference_headers, headers);
int headerId = getIntent() != null ? getIntent().getIntExtra("header", 0) : 0;
if (headerId > 0) {
getIntent().removeExtra("header");
switchToHeader(findHeaderById(headerId));
}
}
private Header findHeaderById(long id) {
if (headers != null)
for (Header header : headers)
if (header.id == id) return header;
return null;
}
This shows how to call the PreferenceActivity together with the fragment in your MainActivity:
Intent intent = new Intent(context, MyPreferenceActivity.class);
intent.putExtra("header", R.id.header1);
intent.putExtra("key", "pref1");
startActivity(intent);
If necessary, you can open the respective preference right away in PreferenceFragment1:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_1);
String key = getActivity().getIntent() != null ? getActivity().getIntent().getStringExtra("key") : null;
if (key != null) {
getActivity().getIntent().removeExtra(key);
openPreference(key);
}
}
private void openPreference(String key) {
PreferenceScreen preferenceScreen = getPreferenceScreen();
ListAdapter listAdapter = preferenceScreen.getRootAdapter();
for (int position = 0; position < listAdapter.getCount(); position++) {
Preference preference = (Preference) listAdapter.getItem(position);
if (preference.equals(findPreference(key))) {
preferenceScreen.onItemClick(null, null, position, 0);
break;
}
}
}
preference_headers.xml:
preferences_1.xml: