tutorial studio preferencias preferencia pantalla editar crear configuracion archivos activity java android xml dependencies preferences

java - studio - ¿Cómo hacer frente al atributo de preferencia android: dependencia?



preferencias en android studio (5)

¿Hay algún atributo XML que haga exactamente lo contrario de android:dependency ?

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 sea con android:dependency tal vez haya un atributo xml que pueda agregar para desactivar la preferencia predeterminada y luego android:dependency lo alternará de la manera opuesta como yo quiera.

editar de nuevo: Intenté configurar android:enabled="false" en la preferencia y lo desactiva como quiero, pero incluso si depende de la otra preferencia, no lo habilitó como esperaba


Dmytro Zarezenko preguntó si desea que algunas dependencias se habiliten cuando la preferencia de la que dependen es verdadera y otra que se habilite cuando esa preferencia es falsa.

Use 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 implementos OnSharedPreferenceChangeListener) tiene un código como este en la Actividad de preferencia y / o Fragmento de preferencia:

@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)); } }


En realidad, lo encontré solo y pensé que simplemente lo publicaría aquí para ayudar a cualquiera que pudiera tener este mismo problema:

android:disableDependentsState="true"

Ponlo en la preferencia de control.


Esta es mi muestra de código para hacer esto desde el código y no XML.

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) { }


Haga que su implement PreferenceActivity

SharedPreferences.OnSharedPreferenceChangeListener

declarar en PreferenceActivity :

SharedPreferences prefs;

inicializar en onCreate :

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

y registrarse en el oyente de cambio de preferencia compartida

prefs.registerOnSharedPreferenceChangeListener(this);

haga lo mismo que dijo Steve en los métodos onResume y onPause .

implementación del oyente onSharedPreferenceChanged :

@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 a medida que el usuario verifica uno de ellos, el otro se desactiva (en gris). A medida que el usuario desmarca la preferencia marcada, el usuario puede verificar la otra.

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


Necesito cambiar el valor de la preferencia dependiente, así que publico mi código a continuación, 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); }