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