2010-08-28 13 views
59

¿Hay algún atributo XML que haga exactamente lo contrario de android:dependency?Cómo hacer lo contrario al atributo de preferencia android: ¿dependencia?

Lo que me gustaría es que la preferencia dependiente esté habilitada cuando la otra NO está marcada y deshabilitada cuando está marcada.

editar: tal vez el problema no es con android:dependency tal vez haya un atributo xml que puedo agregar para desactivar la preferencia predeterminada y luego android:dependency lo alternará de la manera opuesta como yo quiero.

editar nuevamente: que intentó establecer android:enabled="false" en la preferencia y lo inhabilita como yo quiero, sino incluso con él que es dependiente de la otra preferencia que no lo habilitó como yo había esperado

Respuesta

115

En realidad encontré en mi propia y pensé que acababa de publicar aquí para ayudar a cualquiera que pudiera tener este mismo problema:

android:disableDependentsState="true" 

poner esto en la preferencia de control.

+1

confirmado ... agrega esa línea a la preferencia que pones en android: dependencia :) –

+7

Para ser aún más claro: pon esa línea en la preferencia de la que depende ** tu preferencia **. El documento dice: "El estado (verdadero para encendido, o falso para apagado) que causa ** dependientes ** para ser deshabilitado". – BoD

+21

Pero si quiero habilitar algunas preferencias y desactivar algunas preferencias depende de una casilla de verificación pref? –

1

Este es mi ejemplo de código para hacer esto desde el código y no XML. preguntó

String eitherKey = "either"; 
    String orKey = "or"; 
    CheckBoxPreference either = new CheckBoxPreference(this); 
    either.setKey(eitherKey); 
    either.setTitle("Either"); 
    either.setSummary("It is either one or"); 
    either.setDefaultValue(false); 
    either.setDisableDependentsState(true); 
    inlinePrefCat.addPreference(either); 

    try 
    { 
    //Crossfade Time 
    CheckBoxPreference or = new CheckBoxPreference(this); 
    or.setKey(orKey); 
    or.setTitle("Or"); 
    or.setSummary("the other"); 
    inlinePrefCat.addPreference(or); 
    or.setDependency(eitherKey); 
    } 
    catch (Exception e) 
    { 
    } 
8

Dmytro Zarezenko lo que si quería algunas dependencias que se activen cuando la preferencia de la que dependen es cierto y algunos que se activen cuando esa preferencia es falsa.

Utilice el método descrito anteriormente para configurar todas las preferencias dependientes de un tipo (que tengan el mayor número). Entonces (con la clase que tiene los implementos OnSharedPreferenceChangeListener) tienen un código como éste en la preferencia de actividad y/o preferencia Fragmento:

@Override 
public void onResume() 
{ 
    super.onResume(); 
    sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
} 
@Override 
public void onPause() 
{ 
    super.onPause(); 
    sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); 
} 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
{ 
    if (key.equals("pref_that_they_depend-upon") 
    { 
     // Iterate over the preferences that need to be enabled or disabled, 
     // lets say there is just one called the_awkward_one. 
     Preference preference = findPreference("the_awkward_one"); 
     // Or preference.setEnabled(! sharedPreferences.getBoolean(("pref_that_they_depend-upon", defaultValue)); 
     preference.setEnabled(sharedPreferences.getBoolean(("pref_that_they_depend-upon", defaultValue)); 
    } 
} 
0

que necesito para cambiar el valor de la preferencia depende, por lo que puedo enviar mi código de abajo, si alguien quiere hacer esto:

@Override 
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 
    if(preference.getKey().equals("key_a")) { 
     ((CheckBoxPreference)findPreference("key_b").setChecked(false); 
    } 
    return super.onPreferenceTreeClick(preferenceScreen, preference); 
} 
+0

En mi humilde opinión, la solución de Steve Waring es preferible, porque funciona * independientemente * de qué causa el valor de preferencia para cambiar. Es decir, si establece "key_a" * en el código *, la solución de Waring tendrá efecto, mientras que la de aquí no (porque no hay "clic"). – ToolmakerSteve

0

haga su PreferenceActivityimplement

SharedPreferences.OnSharedPreferenceChangeListener

declarar en PreferenceActivity:

SharedPreferences prefs;

inicializar en onCreate:

SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this); prefs = sPrefs;

y registrar el cambio de preferencia compartida oyente

prefs.registerOnSharedPreferenceChangeListener(this); 

hacer lo mismo que dijo Steve en onResume y m ethods.

implementación de onSharedPreferenceChanged oyente:

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    Log.d("SettingsActivity","onSharedPreferenceChanged LISTENER FIRED"); 
    if (key.equals(getString(R.string.key_call))) { 
     //if call true 
     if (sharedPreferences.getBoolean(getString(R.string.key_call), false)) { 
      Preference preference = findPreference(getString(R.string.key_record)); 
      preference.setEnabled(false); 
     } else { // if call false 
      Preference preference = findPreference(getString(R.string.key_record)); 
      preference.setEnabled(true); 
     } 
    } 
    if (key.equals(getString(R.string.key_record))) { 
     //if record true 
     if (sharedPreferences.getBoolean(getString(R.string.key_record), false)) { 
      Preference preference = findPreference(getString(R.string.key_call)); 
      preference.setEnabled(false); 
     } else { // if record false 
      Preference preference = findPreference(getString(R.string.key_call)); 
      preference.setEnabled(true); 
     } 
    } 
} 

En este caso, tengo 2 Preferencias mutuamente excluyentes en PreferenceActivity. Llamar y grabar. Cuando ambos están desmarcados, ambos pueden verificarse, pero cuando el usuario verifica uno de ellos, el otro se desactiva (gris). Cuando el usuario desmarca la preferencia marcada, el usuario puede verificar la otra.

En ambos, otras preferencias pueden depender y se pueden resolver con el atributo android:dependancy en el archivo XML.

Cuestiones relacionadas