webentwicklung-frage-antwort-db.com.de

Wie kann ich Einstellungen auf Android dynamisch ein- und ausblenden?

Gibt es eine Möglichkeit, Einstellungen dynamisch anzuzeigen und zu verbergen? In meinem Fall habe ich eine Checkbox-Präferenz, die eine von 2 Präferenzgruppen ("mit" und "ohne Handicap") deaktivieren oder aktivieren würde. Während dies die ideale Benutzeroberfläche in einer Desktop-Umgebung ist, nimmt das "With-Handicap" fast den gesamten Bildschirm ein, während das andere "Without-Handicap" nur einen kleinen Teil des Bildschirms einnimmt.

Anstatt beide Gruppen gleichzeitig anzuzeigen, möchte ich nur 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?

27
Japtar

Von einem PreferenceActivity-Aufruf

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

sie können später anrufen:

preferenceScreen.addPreference(somePreference);

Der einzige etwas knifflige Teil ist, die Reihenfolge beim Hinzufügen wiederherzustellen. Siehe PreferenceScreen Dokumentation, insbesondere die Basisklasse, PreferenceGroup für Details.

Hinweis: Das oben gesagte funktioniert nur für unmittelbare Kinder einer PreferenceScreen. Wenn sich eine PreferenceCategory dazwischen befindet, müssen Sie die Voreinstellung von ihrer übergeordneten PreferenceCategory entfernen, nicht von der PreferenceScreen. Stellen Sie zunächst sicher, dass für die Variable PreferenceCategory ein Attribut Android:key in der XML-Datei festgelegt ist. Dann:

Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(SOME_PREFERENCE_CATEGORY_KEY);
preferenceCategory.removePreference(somePreference);

und:

preferenceCategory.addPreference(somePreference);
57
dhaag23

Ich empfehle die Verwendung von V7 , es hat setVisible() Methode. Aber ich habe es noch nicht ausprobiert.

2
Tea

Nicht genau versteckt/angezeigt, aber wenn Sie die Einstellung abhängig von einer anderen Einstellung nur deaktivieren oder aktivieren möchten, können Sie Android:dependency="preferenceKey" oder Preference.setDependency(String) angeben.

Beispiel aus 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>
2
hidro

Um Präferenzen dynamisch auszublenden, habe ich eine if-Bedingung erstellt, über deren Wert ich entscheiden kann, ob der Präfix angezeigt werden soll oder nicht. Um das eigentliche Verstecken durchzuführen, habe ich verwendet:

    findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);

Der schwierige Teil ist, es wieder sichtbar zu machen. Es gibt keine direkte Möglichkeit, das Layout neu zu erstellen. Wenn der Wert der if-Bedingung falsch ist, was bedeutet, dass die Präferenz sichtbar sein sollte, wird der Code zum Ausblenden der Präferenz niemals ausgeführt, was zu einer sichtbaren Präferenz führt. So erstellen Sie das Layout neu (in meinem Fall erweitere ich ein PreferencesListFragment):

    getActivity().recreate();

Ich hoffe das war hilfreich. 

0
Marline

Wenn Sie das Ausblenden der Präferenz vollständig in der Präferenz implementieren möchten, finden Sie hier 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
}
0
digitalfootmark

Ich brauchte etwas Ähnliches: einen Schalter umschalten, um zwei zusätzliche Einstellungen anzuzeigen oder auszublenden. Schauen Sie sich 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 umzuschalten, um eine Präferenzkategorie anzuzeigen oder auszublenden.

In dem Fragment, das PreferenceFragmentCompatDividers erweitert, könnten Sie Folgendes verwenden:

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 ausgeblendet werden, wenn pref_show_extra_stuff umgeschaltet wird.

0
adriennoir