2011-01-16 7 views
24

C'è un modo per mostrare e nascondere le preferenze in modo dinamico? Nel mio caso, ho una preferenza per la casella di controllo che disabilita o abilita uno dei 2 gruppi di preferenze (gruppi "with-" e "without-handicap"). Mentre questa sarebbe la GUI ideale in un ambiente desktop, il "con-handicap" occupa quasi l'intero schermo, mentre l'altro, "senza-handicap" occupa solo una piccola porzione dello schermo.Come mostrare e nascondere le preferenze su Android in modo dinamico?

Invece di mostrare entrambi i gruppi allo stesso tempo, mi piacerebbe mostrarne solo uno alla volta, e mostrare o nascondere dinamicamente i 2 gruppi quando la casella di controllo cambia. C'è un modo per fare questo?

+0

Se anche http://stackoverflow.com/questions/2240326/remove-hide-a-preference-from-the-screen per una risposta migliore, nel caso in cui si sta utilizzando le categorie. – Eyal

risposta

54

Da una chiamata PreferenceActivity

Preference somePreference = findPreference(SOME_PREFERENCE_KEY); 
PreferenceScreen preferenceScreen = getPreferenceScreen(); 
preferenceScreen.removePreference(somePreference); 

in seguito sarà possibile chiamare:.

preferenceScreen.addPreference(somePreference); 
parte

L'unica un po 'difficile è sempre nell'ordine corretto quando si aggiungono indietro nel Guardate PreferenceScreen documentazione, in particolare è la classe base, PreferenceGroup per i dettagli.

+0

Grr, immagino che non ci siano opzioni "visibili" in Android, dopotutto. Grazie per la risposta. – Japtar

+1

Dopo aver rimosso una seconda chiamata di preferenza a "findPreference()" restituisce "null", come aggiungerlo di nuovo? –

+6

@Mickey Tin: basta salvare la preferenza (somePreference) sopra come membro della classe quando la trovi, quindi puoi rimuoverla e aggiungerla se necessario. – dhaag23

2

Non esattamente nascondere/mostrare, ma se si desidera solo disabilitazione/abilitazione preferenza a seconda un'altra preferenza è possibile specificare android:dependency="preferenceKey" o Preference.setDependency(String)

Esempio da developer.android.com:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <CheckBoxPreference 
     android:key="pref_sync" 
     android:title="@string/pref_sync" 
     android:summary="@string/pref_sync_summ" 
     android:defaultValue="true" /> 
    <ListPreference 
     android:dependency="pref_sync" 
     android:key="pref_syncConnectionType" 
     android:title="@string/pref_syncConnectionType" 
     android:dialogTitle="@string/pref_syncConnectionType" 
     android:entries="@array/pref_syncConnectionTypes_entries" 
     android:entryValues="@array/pref_syncConnectionTypes_values" 
     android:defaultValue="@string/pref_syncConnectionTypes_default" /> 
</PreferenceScreen> 
0

Se si desidera implementare il nascondiglio della preferenza completamente nella preferenza, ecco un esempio. Non consente di renderlo nuovamente visibile, però.

public class RemovablePreference extends Preference { 

@Override 
protected void onBindView(View view) { 
    super.onBindView(view); 

    updateVisibility(); // possibly a better place available? 
} 

private void updateVisibility() { 
    Context context = getContext(); // should be a PreferenceActivity 
    if (context instanceof PreferenceActivity) { 
     updateVisibility((PreferenceActivity)context); 
    } 
} 

private void updateVisibility(PreferenceActivity activity) { 
    updateVisibility(getPreferenceScreen(activity)); 
} 

private PreferenceScreen getPreferenceScreen(PreferenceActivity activity) { 

    if (activity.getPreferenceScreen() != null) { 
     return activity.getPreferenceScreen(); // for old implementations 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     Fragment fragment = activity.getFragmentManager().findFragmentById(android.R.id.content); 
     if (fragment instanceof PreferenceFragment) { 
      return ((PreferenceFragment) fragment).getPreferenceScreen(); 
     } 
    } 
    return null; 
} 

private void updateVisibility(PreferenceScreen screen) { 
    if (!isVisible() && screen != null) { 
     hidePreference(screen, this); 
    } 
} 

private boolean hidePreference(PreferenceGroup prefGroup, Preference removedPreference) { 
    boolean removed = false; 

    if (prefGroup.removePreference(removedPreference)) { 
     removed = true; 
    } 

    for (int i = 0; i < prefGroup.getPreferenceCount(); i++) { 
     Preference preference = prefGroup.getPreference(i); 
     if (preference instanceof PreferenceGroup) { 
      PreferenceGroup prefGroup2 = (PreferenceGroup)preference; 
      if (hidePreference(prefGroup2, this)) { 
       // The whole group is now empty -> remove also the group 
       if (prefGroup2.getPreferenceCount() == 0) { 
        removed = true; 
        prefGroup.removePreference(prefGroup2); 
       } 
      } 
     } 
    } 

    return removed; 
} 

protected boolean isVisible() { 
    return true; // override 
} 
1

mi consiglia di utilizzare V7 preference, ha setVisible() metodo. Ma non l'ho ancora provato.

0

Avevo bisogno di qualcosa di simile: attivare un interruttore per nascondere o mostrare due preferenze extra. Dai un'occhiata all'app di esempio da Android-Support-Preference-V7-Fix che porta alcuni nuovi tipi di preferenza e corregge alcuni problemi dalla libreria ufficiale. C'è un esempio lì per attivare una casella di controllo per mostrare o nascondere una categoria di preferenze.

Nel frammento che si estende PreferenceFragmentCompatDividers, si potrebbe usare qualcosa come:

findPreference("pref_show_extra_stuff").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      findPreference("pref_extra_stuff_01").setVisible((Boolean) newValue); 
      findPreference("pref_extra_stuff_02").setVisible((Boolean) newValue); 
      return true; 
     } 
    }); 

pref_extra_stuff_01 e pref_extra_stuff_02 sono i due preferenze che si nascondono quando pref_show_extra_stuff è attivata.