2012-05-29 7 views
22

Agregué los encabezados de preferencia a mi aplicación para que la pantalla de preferencias no se vea rota en el ICS de Honeycomb y de la tableta. Sin embargo, solo tengo un encabezado en este momento, por lo que debe hacer clic en una pantalla de encabezado con solo una entrada en los dispositivos de tamaño telefónico. ¿Hay alguna manera fácil de decirle a Android que saltee la pantalla de encabezado cuando solo hay un encabezado, pero que aún así se muestre en pantallas grandes?Omita los encabezados en PreferenceActivity cuando solo hay un encabezado

Parece que la aplicación Stock Contacts hace esto con éxito, pero he navegado a través de su source y no puedo entender cómo lo está haciendo.

+0

En la aplicación Contactos, se especifica el PreferenceFragment por defecto cuando se inicia la actividad de la configuración del menú, utilizando la misma técnica dada por @ jdr88. Para obtener más información, vaya [aquí] (https://github.com/android/platform_packages_apps_contacts/blob/master/src/com/android/contacts/activities/PeopleActivity.java) y Ctrl-F para 'settingsAreMultiPane' –

Respuesta

54

Puede omitir los encabezados configurando uno de sus PreferenceFragments como predeterminado.

Al echar un vistazo a la fuente PreferenceActivity.java, se encuentran estas 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 sólo tiene que añadir estas dos extras a la intención, que está invocando su PrefenceActivity y especifique la PreferenceFragment la que se debe mostrar por defecto como sigue:

Intent intent = new Intent(this, Preferences.class); 
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName()); 
intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true); 
+3

Eso es lo que ¡Estaba buscando! Gracias. Descubrí que el uso de EXTRA_SHOW_FRAGMENT significaba que los encabezados aún son visibles en una tableta, pero salta directamente al fragmento de configuración en un teléfono, que es exactamente lo que yo quería. –

+0

¿Puedes aclarar a qué te refieres con "establecer uno de tus PreferenceFragments como predeterminado"? Mi versión está abajo. No vi una forma alternativa de especificar un valor predeterminado en el XML. (Comprobé el origen del análisis XML.) – Anm

+0

¡Punto en la respuesta! – feresr

1

No sé si puede omitir específicamente el encabezado, pero esto es lo que hice.

Creé 2 clases, una para los tamaños de pantalla extra grandes y otra para el resto. EditPreferences.class carga mi preferences.xml normal, y EditPreferencesXLarge.class carga el xml de encabezados de preferencia.

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)); 
} 
4

Utilizando el EXTRA_SHOW_FRAGMENT mencionado por jenzz, puede 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); 
} 
1

Puede quitar este código en su actividad.

 public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.pref_general, target); 
    } 

Y reemplazar su 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); 

     } 

    } 

} 
Cuestiones relacionadas