parte - quitar status bar android
Eliminar/ocultar una preferencia de la pantalla (9)
Aquí hay una forma genérica de hacer esto que funciona independientemente de si la preferencia está en una PreferenceCategory
o PreferenceScreen
.
private void removePreference(Preference preference) {
PreferenceGroup parent = getParent(getPreferenceScreen(), preference);
if (parent == null)
throw new RuntimeException("Couldn''t find preference");
parent.removePreference(preference);
}
private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) {
for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) {
Preference child = groupToSearchIn.getPreference(i);
if (child == preference)
return groupToSearchIn;
if (child instanceof PreferenceGroup) {
PreferenceGroup childGroup = (PreferenceGroup)child;
PreferenceGroup result = getParent(childGroup, preference);
if (result != null)
return result;
}
}
return null;
}
Tengo una actividad que extiende PreferenceActivity. Estoy cargando preferencias del archivo xml. Pero en algunos casos necesito ocultar por completo una de las preferencias de la pantalla en función del estado de mi aplicación. Hay un método setEnabled, pero no es exactamente lo que quiero. Quiero eliminar esa preferencia de la pantalla por completo. Es posible ?
En el archivo XML, puede hacer una preferencia oculta dejando las etiquetas de título y resumen vacías.
<EditTextPreference
android:defaultValue="toddlerCam"
android:key="save_photo_dir"
/>
En el caso en que la preferencia es un elemento directo de la pantalla de preferencias, aquí hay un código independiente:
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
En tu archivo XML:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="preferenceScreen">
<PreferenceCategory
android:key="personalisation"
android:title="your title here">
<ThemedPreference
android:key="animation" />
</PreferenceScreen>
En tu código:
PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation");
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation");
pPreferenceScreen.removePreference(pCategory); //remove category
pCategory.removePreference(pThemePref); // remove preference
Recomiendo usar la preferencia V7, tiene el método setVisible (). Pero aún no lo he intentado. En consecuencia, debe utilizar PreferenceFragment en lugar de PreferenceActivity https://developer.android.google.cn/reference/android/support/v7/preference/Preference.html#setVisible(boolean)
Si desea evaluar, y en base a esa máscara, una alternativa puede ser / (Si desea evaluar, y en base a eso ocultar, una alternativa puede ser):
SwitchPreference autenticacionUsuario = (SwitchPreference) findPreference("key_autenticacion_usuario");
final EditTextPreference Username = (EditTextPreference) findPreference("key_username_mqtt");
final EditTextPreference Password = (EditTextPreference) findPreference("key_password_mqtt");
if (!autenticacionUsuario.isChecked()) {
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("category_mqtt");
preferenceCategory.removePreference(Username);
preferenceCategory.removePreference(Password);
}
Todo esto debe estar dentro de / (Todo esto debe ir dentro):
public static class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Si quiere algo que cambie dinámicamente las preferencias, por ejemplo, en SwitchPreference, he encontrado que la mejor manera es poner todas mis subopciones en dos contenedores de categoría. Inicialmente tendrá todo lo que se muestra, luego solo eliminará los bits que no quiere. Lo más inteligente es que solo desencadenas recrear cuando algo cambia y luego no tienes que crear nada manualmente o preocuparte por volver a poner las cosas en el orden correcto.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne");
PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo");
SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref");
PreferenceScreen screen = getPreferenceScreen();
if (mySwitchPref.isChecked()) {
screen.removePreference(prefCatOne);
} else {
screen.removePreference(prefCatTwo);
}
}
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("mySwitchPref")) {
this.recreate();
}
}
El único inconveniente que puedo ver con esto es que hay un flash ya que la pantalla se recrea desde cero.
Si su Preference
está dentro de una categoría de PreferenceCategory
, debe hacer esto:
XML:
<PreferenceCategory
android:key="category_foo"
android:title="foo">
<CheckBoxPreference
android:key="checkPref" />
Java:
CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);
Sí, si tiene una referencia tanto a la Preference
como a su elemento primario (una PreferenceCategory
o PreferenceScreen
)
myPreferenceScreen.removePreference(myPreference);