2012-07-08 1 views
50

Sto cercando di realizzare qualcosa che ritengo sia abbastanza semplice, ma sono sconcertato su come realizzarlo usando la classe PreferenceActivity e il tag xml di preferenza-header.Preference pagina singolaAttività senza intestazioni/frammenti?

Quando l'utente tocca l'icona delle impostazioni app Io li vorrei essere presentato con una piccola lista di caselle di controllo ed elenchi. Ho solo un singolo frammento di preferenze. Finora posso impostare i file xml PreferenceActivity (preferences.xml e preference fragments xmls) per mostrare la singola intestazione per il frammento di preferenza. Quando l'utente seleziona quell'intestazione, la schermata delle preferenze è esattamente come la voglio io, tuttavia, non riesco a capire un modo per saltare la visualizzazione della prima schermata di intestazione.

sembra uno spreco di dover toccare l'icona Impostazioni/preferenze, mostrano un singolo colpo di testa che viene poi sfruttato per raggiungere le attuali impostazioni/preferenze.

capisco come questo può essere molto utile se si desidera classificare le preferenze, ma di qualcosa di semplice, questo aggiunge in testa e sembra piuttosto goffo.

Spero di essere stato chiaro. In breve ecco la mia domanda:

Qual è il nuovo modo preferito per utilizzare il tag di classe PreferenceActivity e la preferenza-header per mostrare semplicemente un unico schermo di opzioni con nessuna intestazione?

Dopo aver cercato un po 'sembra che io sto cercando di fare ciò che i vecchi metodi hanno fatto in modo diretto. Sto cercando di farlo senza usare nessuna delle funzioni deprecate.

Grazie in anticipo, B.

+1

Avevo un requisito simile. Finito usando questa soluzione https://stackoverflow.com/a/10960720/276263 – krishnakumarp

risposta

22

Ero in cerca di una risposta che ha trovato questa domanda. Alla fine, ho lavorato fuori da diverse altre fonti. Per quelli che potrebbero ancora volere una risposta, ecco cosa ha funzionato per me. (Nota: entrambi gli SDK min e target sono impostati su 15 in questo progetto.)

  1. Scarica le PreferenceHeaders, non ne avrai bisogno.
  2. Creare una schermata di preferenza con le impostazioni di una singola pagina.
  3. Creare una classe di attività di preferenza (ImpostazioniAttività in basso).
  4. Creare una classe inline che estende PreferenceFragment (LocationFragment di seguito).
  5. Definire la classe nel manifesto.
  6. Avviare l'attività - vedere il codice del menu di seguito.

La classe di preferenza che visualizza la schermata delle impostazioni singole.

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

Il codice per visualizzare le impostazioni:

@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; 
} 

il tasto Indietro termina la SettingsActivity. Le routine di preferenza incorporate salvano eventuali modifiche. La funzione onResume che ho ha un getSettings() che aggiorna le impostazioni modificate utilizzate dall'attività di chiamata (MainActivity in questo caso).

Questo è tutto.

+0

E se continui a vedere le vecchie intestazioni in cima al tuo Fragmant, assicurati di eliminare il metodo 'onBuildHeaders()'. – iTurki

77

Nuovo modo preferito è mostrare un singolo PreferenceFragment come il contenuto principale di qualsiasi attività.Non è necessario che sia PreferenceActivity. Guarda l'esempio dimostrativo delle 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

Questo non funzionerà su API 11 inferiore ... a causa del metodo getFragmentManager() che viene aggiunto in API 11. –

+0

getFragmentManager() può essere chiamato se si utilizza la libreria di supporto. – TheIT

+0

sì! bella soluzione .. non mi ero reso conto che PreferenceFragment poteva essere usato anche senza essere annidato in PreferenceActivity! ;) –