I added preference-headers to my app so that the preference screen would not look broken on Honeycomb and tablet sized ICS. However, I only have one header at the moment so
You can skip the headers by setting one of your PreferenceFragments as default.
When you take a look at the PreferenceActivity.java source, you will find these two extras:
/**
* When starting this activity, the invoking Intent can contain this extra
* string to specify which fragment should be initially displayed.
*/
public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";
/**
* When starting this activity, the invoking Intent can contain this extra
* boolean that the header list should not be displayed. This is most often
* used in conjunction with {@link #EXTRA_SHOW_FRAGMENT} to launch
* the activity to display a specific fragment that the user has navigated
* to.
*/
public static final String EXTRA_NO_HEADERS = ":android:no_headers";
Now simply add these two extras to the intent which is invoking your PrefenceActivity and specify the PreferenceFragment which should be shown by default as follows:
Intent intent = new Intent( this, Preferences.class );
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName() );
intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
I don't know if you can specifically skip the header, but this is what I did.
I created 2 classes, one for Extra Large screen sizes, and one for the rest. EditPreferences.class loads my normal preferences.xml, and the EditPreferencesXLarge.class loads the preference-headers xml.
public boolean onOptionsItemSelected(MenuItem item) {
final int SCREENLAYOUT_SIZE_XLARGE = 4;
final int HONEYCOMB = 11;
int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
switch(item.getItemId())
{
case R.id.item_prefs:
if (Build.VERSION.SDK_INT < HONEYCOMB) {
startActivity(new Intent(this, EditPreferences.class));
}
else if (screenSize < SCREENLAYOUT_SIZE_XLARGE) {
startActivity(new Intent(this, EditPreferences.class));
}
else {
startActivity(new Intent(this, EditPreferencesXLarge.class));
}
return true;
}
return (super.onOptionsItemSelected(item));
}
You can remove this code in your activity.
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.pref_general, target);
}
And replace your fragment :
public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content,
new GeneralPreferenceFragment()).commit();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
}
}
}
Utilizing the EXTRA_SHOW_FRAGMENT
mentioned by jenzz, you can manipulate the Activity's Intent, like so:
@Override
protected void onCreate(Bundle savedInstanceState) {
// By default, show MainPreferences
Intent intent = getIntent();
if (intent.getStringArrayExtra(EXTRA_SHOW_FRAGMENT) == null) {
getIntent().putExtra(EXTRA_SHOW_FRAGMENT, MainPreferences.class.getName());
}
super.onCreate(savedInstanceState);
}