2011-01-16 9 views
24

Gibt es eine Möglichkeit, Voreinstellungen dynamisch ein- und auszublenden? In meinem Fall habe ich eine Checkbox-Präferenz, die eine von zwei Präferenzgruppen ("mit-" und "ohne Behinderung" -Gruppen) deaktiviert oder aktiviert. Während dies in einer Desktop-Umgebung die ideale GUI wäre, nimmt das "Handicap" fast den gesamten Bildschirm ein, während das andere "ohne Handicap" nur einen kleinen Teil des Bildschirms einnimmt.Wie können Voreinstellungen auf Android dynamisch ein- und ausgeblendet werden?

Anstatt beide Gruppen gleichzeitig anzuzeigen, möchte ich nur jeweils eine von ihnen gleichzeitig anzeigen und die beiden Gruppen dynamisch ein- oder ausblenden, wenn sich das Kontrollkästchen ändert. Gibt es eine Möglichkeit, dies zu tun?

+0

Ich auch http://stackoverflow.com/questions/2240326/remove-hide-a-preference-from-the-screen für eine bessere Antwort, falls Sie Kategorien verwenden. – Eyal

Antwort

54

Aus PreferenceActivity Anruf

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

Sie später anrufen:.

preferenceScreen.addPreference(somePreference); 

Das ist nur ein wenig schwieriger Teil richtig den Auftrag erhält, wenn sie in zurück Zugabe von PreferenceScreen Dokumentation suchen, insbesondere Es ist Basisklasse, PreferenceGroup für Details.

+0

Grr, ich denke, es gibt schließlich keine "sichtbaren" Optionen in Android. Danke für die Antwort. – Japtar

+1

Nach dem Entfernen einige Präferenz zweiten Aufruf an 'findPreference()' gibt 'null', wie man es wieder hinzufügen? –

+6

@Mickey Tin: Speichern Sie die Präferenz (somePreference) oben als ein Klassenmitglied, wenn Sie es finden, dann können Sie es entfernen und bei Bedarf hinzufügen. – dhaag23

2

Nicht gerade versteckt/angezeigt, aber wenn Sie nur wollen deaktivieren/aktivieren Präferenz auf eine andere Präferenz je Sie android:dependency="preferenceKey" oder Preference.setDependency(String)

Beispiel von developer.android.com angeben:

<?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

Wenn Sie das Versteck implementieren möchten von der Präferenz vollständig in der Präferenz, hier ist ein Beispiel. Erlaubt es jedoch nicht, es wieder sichtbar zu machen.

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

ich mit V7 preference empfehlen, es hat setVisible() Methode. Aber ich habe es noch nicht ausprobiert.

0

Ich brauchte etwas ähnliches: einen Schalter umschalten, um zwei zusätzliche Einstellungen zu verbergen oder anzuzeigen. Schau dir die Beispiel-App von Android-Support-Preference-V7-Fix an, die einige neue Präferenztypen enthält und einige Probleme aus der offiziellen Bibliothek behebt. Es gibt ein Beispiel, um ein Kontrollkästchen zum Ein- oder Ausblenden einer Präferenzkategorie zu aktivieren.

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 und pref_extra_stuff_02 sind die beiden Einstellungen, die versteckt sind, wenn pref_show_extra_stuff umgeschaltet wird:

Im Fragment, das PreferenceFragmentCompatDividers erstreckt, könnten Sie so etwas wie verwenden.

Verwandte Themen