android - findpreference - preferencefragmentcompat
Omita los encabezados en PreferenceActivity cuando solo hay un encabezado (4)
Agregué encabezados de preferencias a mi aplicación para que la pantalla de preferencias no se vea rota en Honeycomb y en el ICS del tamaño de una tableta. Sin embargo, solo tengo un encabezado en este momento, así que tienes que hacer clic en una pantalla de encabezado con una sola entrada en dispositivos del tamaño de un teléfono. ¿Hay una manera fácil de decirle a Android que se salte la pantalla del encabezado cuando solo hay un encabezado, pero que aún se muestre en pantallas grandes?
Parece que la aplicación Stock Contacts lo hace con éxito, pero he explorado su source y no puedo averiguar cómo lo está haciendo.
No sé si puedes omitir específicamente el encabezado, pero esto es lo que hice.
Creé 2 clases, una para tamaños de pantalla Extra Large y otra para el resto. EditPreferences.class carga mis preferences.xml normales, y EditPreferencesXLarge.class carga el xml de encabezados de preferencias.
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));
}
Puede omitir los encabezados configurando uno de sus PreferenceFragments como predeterminado.
Cuando eche un vistazo a la fuente PreferenceActivity.java , encontrará estos dos 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";
Ahora simplemente agregue estos dos extras a la intención que está invocando su PrefenceActivity y especifique el PreferenceFragment que se mostrará de manera predeterminada de la siguiente manera:
Intent intent = new Intent( this, Preferences.class );
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName() );
intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
Puedes eliminar este código en tu actividad.
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.pref_general, target);
}
Y reemplaza tu fragmento:
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);
}
}
}
Utilizando el EXTRA_SHOW_FRAGMENT
mencionado por jenzz, puedes manipular la intención de la actividad, así:
@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);
}