Parece que debería ser muy simple habilitar / deshabilitar y mostrar / ocultar Preferencias desde el programa de Android. Pero no puedo hacer que funcione más que directamente dentro del archivo XML. Solo he podido encontrar tutoriales y ejemplos de preferencias obsoletas. Aquí hay un ejemplo en el que estoy tratando de ponerme a trabajar para ocultar y deshabilitar las dos preferencias a continuación.

root_preferences.xml

<androidx.preference.PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:key="hidePref"
        app:title="Hide/Show"
        app:summary="Change this preference's visibility"/>

    <Preference
        android:key="disablePref"
        app:title="Enable/Disable"
        app:summary="Enable or Disable this preference"/>

</androidx.preference.PreferenceScreen>
MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    val sharedPreferences = Preferencemanager.getDefaultSharedPreferences(this)

    //No idea how to do the following but here are guess that obviously do not work
    sharedPreferences.edit().isVisible("hidePref", View.GONE).apply()
    sharedPreferences.edit().isEnabled("disabledPref", false).apply()
    ...
}
0
Tom 4 ago. 2020 a las 04:22

1 respuesta

La mejor respuesta

SharedPreferences y Preference son dos clases muy distintas. Un SharedPreferences es un objeto singleton que le permite interactuar con el archivo de propiedades que contiene su mapa de datos de preferencias. Un Preference es un widget de vista que permite al usuario modificar directamente SharedPreferences.

Lo que está describiendo que desea hacer es modificar la visibilidad o el estado habilitado de los widgets de vista Preference s. Esto no involucrará a SharedPreferences en absoluto.

Es de suponer que tiene sus vistas de preferencia en la pantalla en un PreferenceFragmentCompat como explica la documentación. Para modificar una vista Preference específica, usa findPreference() en su fragmento. Puede especificar un tipo más específico que Preference si es necesario (siempre que coincida con el tipo de preferencia real en su XML que está buscando).

El tipo de retorno es anulable porque devuelve un valor nulo si no lo encuentra. Busca la preferencia usando su clave. Entonces, para hacer lo que su código publicado parece estar destinado a hacer, podría poner:

class MySettingsFragment: PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.root_preferences, null)

        findPreference<Preference>("hidepref")?.isVisible = false
        findPreference<Preference>("disabledPref")?.isEnabled = false
    }

}

Personalmente, elijo poner todas mis claves de preferencia en un archivo de recursos de cadena (y uso tools:ignore="MissingTranslation" en ese archivo para evitar que el linter se queje). De esa manera, las cadenas literales de las claves solo se escriben en un lugar, lo que reduce el error. Escribo funciones auxiliares para obtener estos valores de preferencia de SharedPreferences o encontrar las vistas Preference usando el ID de recurso.

1
Tenfour04 4 ago. 2020 a las 02:56