usar studio medium data como code android preferences

medium - preference android studio



¿Cómo eliminar PreferenceCategory programmatically? (4)

Necesito eliminar una categoría de preferencia programáticamente. Podría eliminar las preferencias individuales con el siguiente código, pero también debo eliminar (desactivar) toda la categoría de preferencias.

PreferenceScreen preferenceScreen = getPreferenceScreen(); EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22"); ((PreferenceGroup) findPreference("prefcat")).removePreference(etp);

Editar: Aquí está el código de trabajo para una PreferenceCategory "prefcat" y una preferencia de niño "pref22":

PreferenceScreen preferenceScreen = getPreferenceScreen(); EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22"); PreferenceGroup preferenceGroup = (PreferenceGroup) findPreference("prefcat"); if (preferenceGroup != null) { preferenceGroup.removePreference(etp); preferenceScreen.removePreference(preferenceGroup); }


No cargue la categoría de PreferenceCategory en primer lugar.

Si está definiendo sus preferencias en Java, no cree la PreferenceCategory .

Si está definiendo sus preferencias en XML, use tres archivos XML:

  1. Uno para cosas antes de esta categoría de magia
  2. Uno para la categoría de magia
  3. Uno para cosas después de esta categoría de magia

En situaciones en las que desee la categoría, cargue los tres archivos XML. En situaciones en las que no desea la categoría, cargue solo el primer y tercer archivo XML.


Proporcione una clave para su PreferenceScreen y su PreferenceCategory en XML:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="preferenceScreen" > <PreferenceCategory android:summary="@string/settings_billing_summary" android:title="Title" android:key="myPrefCat" > <Preference android:key="someKey" android:summary="Sum" android:title="Title" /> </PreferenceCategory> </PreferenceScreen>

Desde su clase, ahora puede consultar su preferenceScreen y preferenceCategory y usar el método removePreference () para eliminar la preferencia de la pantalla:

PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preferenceScreen"); PreferenceCategory myPrefCat = (PreferenceCategory) findPreference("myPrefCat"); preferenceScreen.removePreference(myPrefCat);

Esta respuesta se basa en la respuesta de douarbou que parece estar desactualizada, pero es básicamente la misma.


Puede encontrar el árbol padre-hijo completo recorriendo todas las preferencias y luego verifique cuál es el padre de las preferencias que desee, incluso sin usar el ID del padre:

public static Map<Preference,PreferenceGroup> buildPreferenceParentTree(final PreferenceActivity activity) { final Map<Preference,PreferenceGroup> result=new HashMap<Preference,PreferenceGroup>(); final Stack<PreferenceGroup> curParents=new Stack<PreferenceGroup>(); curParents.add(activity.getPreferenceScreen()); while(!curParents.isEmpty()) { final PreferenceGroup parent=curParents.pop(); final int childCount=parent.getPreferenceCount(); for(int i=0;i<childCount;++i) { final Preference child=parent.getPreference(i); result.put(child,parent); if(child instanceof PreferenceGroup) curParents.push((PreferenceGroup)child); } } return result; }

uso de muestra:

final Map<Preference,PreferenceGroup> preferenceParentTree=buildPreferenceParentTree(SettingsActivity.this); final PreferenceGroup preferenceGroup=preferenceParentTree.get(preferenceToRemove); preferenceGroup.removePreference(preferenceToRemove);

EDITAR: parece que hay una nueva API para esto:

https://developer.android.com/reference/androidx/preference/Preference#setVisible(boolean)

Aunque no estoy seguro si actualmente está disponible o no.


puede ocultar una categoría al hacer referencia a PreferenceScreen :

Yo tu xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="@string/preferenceScreen"> //set all you values //Preference, PreferenceCategory and/or CheckBoxPreference </PreferenceScreen>

en ti string.xml: no te olvides de configurar esta nueva cadena

<string name="preferenceScreen" translatable="false">preferenceScreen</string>

en tu código:

preferenceScreen = (PreferenceScreen) findPreference(getResources().getString(R.string.preferenceScreen));

y luego elimine la categoría de su PreferenceScreen:

myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category)); myPreferenceScreen.removePreference(myCategory);