2011-01-16 12 views
24

Czy istnieje sposób dynamicznego pokazywania i ukrywania preferencji? W moim przypadku mam preferencję pola wyboru, która wyłącza lub włącza jedną z 2 grup preferencji (grupy "z- i" bez-handicapów "). Chociaż byłoby to idealne GUI w środowisku graficznym, "z handicapem" zajmuje prawie cały ekran, podczas gdy drugi "bez-upośledzenia" zajmuje tylko niewielką część ekranu.Jak dynamicznie wyświetlać i ukrywać preferencje w systemie Android?

Zamiast pokazywać obie grupy w tym samym czasie, chcę wyświetlić tylko jedną z nich naraz i dynamicznie pokazać lub ukryć 2 grupy, gdy pole wyboru się zmieni. Czy jest jakiś sposób na zrobienie tego?

+0

Se również http://stackoverflow.com/questions/2240326/remove-hide-a-preference-from-the-screen na lepszą odpowiedź, w przypadku korzystania kategorie. – Eyal

Odpowiedz

54

Od rozmowy PreferenceActivity

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

później można nazwać.

preferenceScreen.addPreference(somePreference); 

Tylko trochę skomplikowana część jest coraz kolejność poprawna podczas dodawania z powrotem w Spójrz na PreferenceScreen dokumentacji, w szczególności jest to klasa podstawowa, PreferenceGroup w celu uzyskania szczegółowych informacji.

+0

Grr, domyślam się, że w Androidzie nie ma "widocznych" opcji. Dziękuję za odpowiedź. – Japtar

+1

Po usunięciu niektórych preferencji, drugie wywołanie funkcji 'findPreference()' zwraca 'null', jak dodać ją ponownie? –

+6

@Mickey Tin: po prostu zapisz Preference (somePreference) powyżej jako członka klasy, kiedy ją znajdziesz, a następnie możesz usunąć i dodać w razie potrzeby. – dhaag23

2

Niezupełnie ukrywanie/pokazywanie ale jeśli chcesz tylko blokowania/odblokowania preferencji w zależności od innej preferencji można określić android:dependency="preferenceKey" lub Preference.setDependency(String)

Przykład z 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

Jeśli chcesz realizować ukrywanie preferencji całkowicie w preferencji, tutaj jest jeden przykład. Nie pozwala jednak na to, by był znowu widoczny.

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

polecam korzystania V7 preference, ma setVisible() metody. Ale jeszcze tego nie próbowałem.

0

Potrzebowałem czegoś podobnego: przełączam przełącznik, aby ukryć lub pokazać dwie dodatkowe preferencje. Sprawdź przykładową aplikację z Android-Support-Preference-V7-Fix, która wprowadza nowe typy preferencji i rozwiązuje niektóre problemy z oficjalnej biblioteki. Jest tam przykład, aby przełączać pole wyboru, aby pokazać lub ukryć kategorię preferencji.

we fragmencie, który rozciąga PreferenceFragmentCompatDividers, można użyć coś takiego:

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 i pref_extra_stuff_02 są dwie preferencje, które są ukryte gdy pref_show_extra_stuff jest przełączana.

Powiązane problemy