2012-07-08 18 views
50

Estoy tratando de lograr algo que creo que es bastante fácil, pero estoy desconcertado sobre cómo lograrlo utilizando la clase PreferenceActivity y la etiqueta xml preference-header.Actividad de preferencia de página única sin encabezados/fragmentos?

Cuando el usuario toca el ícono de configuración de la aplicación, me gustaría que se le presente una lista pequeña de casillas de verificación y listas. Solo tengo un fragmento de preferencia único. Hasta ahora puedo configurar los archivos PreferenceActivity xml (preferences.xml, y los fragmentos de preferencia xmls) para mostrar el único encabezado para el fragmento de preferencia. Cuando el usuario selecciona ese encabezado, la pantalla de preferencias es exactamente como la quiero, sin embargo, no puedo encontrar una manera de omitir la primera pantalla de encabezado.

Parece un desperdicio tener que tocar el icono de configuración/preferencias, mostrar un solo encabezado que luego se toca para llegar a la configuración/preferencias reales.

Entiendo que esto puede ser muy útil si quiere categorizar sus preferencias, pero por algo simple, esto agrega sobrecarga y parece bastante torpe.

Espero que estuviera claro. En resumen, aquí está mi pregunta:

¿Cuál es la nueva forma preferida de utilizar la clase PreferenceActivity y la etiqueta de encabezado de preferencia para mostrar simplemente una sola pantalla de opciones sin encabezado?

Después de mirar un poco más, parece que estoy tratando de hacer lo que los métodos anteriores hicieron de una manera directa. Estoy tratando de hacer esto sin usar ninguna de las funciones en desuso.

Gracias de antemano, B.

+1

Tenía un requisito similar. Terminó usando esta solución https://stackoverflow.com/a/10960720/276263 – krishnakumarp

Respuesta

22

yo estaba buscando una respuesta que corresponde a esta pregunta. Finalmente, lo resolví de varias otras fuentes. Para aquellos que aún quieran que se responda, esto es lo que funcionó para mí. (Nota: tanto el SDK mínimo como el objetivo se establecen en 15 en este proyecto).

  1. Vuelca los PreferenceHeaders, no los necesitarás.
  2. Crea una pantalla de preferencias con la configuración de una sola página.
  3. Cree una clase de actividad de preferencia (ConfiguraciónActividad a continuación).
  4. Crea una clase en línea que amplía PreferenceFragment (LocationFragment a continuación).
  5. Defina la clase en el Manifiesto.
  6. Comience la tarea: consulte el siguiente código de menú.

Clase de preferencia que muestra la pantalla de configuraciones individuales.

public class SettingsActivity extends PreferenceActivity { 

    private final static String TAG = "SettingsAcitivity"; 

    public SettingsActivity() {} 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     MyLog.d(TAG, "onCreate"); 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new LocationFragment()).commit(); 
    } 

    public class LocationFragment extends PreferenceFragment { 

     private final static String TAG = "LocationFragment"; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      MyLog.d(TAG, "onCreate"); 
      addPreferencesFromResource(R.xml.locationsettings); 
     } 
    } 
} 

El código para mostrar los ajustes:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    MyLog.d(TAG, "onOptionsItemSelected"); 
    switch (item.getItemId()) { 
    case R.id.menu_main_help: 
     break; 
    case R.id.menu_main_about: 
     break; 
    case R.id.menu_main_settings: 
     MyLog.d(TAG, "Settings"); 
     Intent settingsIntent = new Intent(this, SettingsActivity.class); 
     startActivity(settingsIntent); 
     break; 
    } 
    return true; 
} 

la llave termina la SettingsActivity. Las rutinas creadas en preferencia guardan cualquier cambio. La función onResume que tengo hace un getSettings() que actualiza cualquier configuración modificada utilizada por la actividad de llamada (MainActivity en este caso).

Eso es todo.

+0

Y si todavía está viendo los encabezados anteriores en la parte superior de su Fragmant, asegúrese de eliminar el método 'onBuildHeaders()'. – iTurki

77

Nueva forma preferida es mostrar un solo PreferenceFragment como el contenido principal de cualquier actividad.No necesita ser PreferenceActivity. Consulte la muestra de demostración de API

public class FragmentPreferences extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Display the fragment as the main content. 
     getFragmentManager().beginTransaction().replace(android.R.id.content, 
       new PrefsFragment()).commit(); 
    } 


    public static class PrefsFragment extends PreferenceFragment { 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.preferences); 
     } 
    } 

} 
+0

Esto no funcionará en una API 11 más baja ... debido al método getFragmentManager() que se agrega en API 11. –

+0

getFragmentManager() se puede llamar si usa la biblioteca de soporte. – TheIT

+0

yup! buena solución ... ¡no me di cuenta de que PreferenceFragment podría usarse también sin estar anidado en PreferenceActivity! ;) –

Cuestiones relacionadas