es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualizar la lista de MultiSelectListPreference de forma programática.

Quiero usar una lista predefinida de elementos en la configuración de la aplicación de Android usando MultiSelectListPreference y algunos valores ya predefinidos en un archivo XML.

Así es como se ve:

Archivo XML:

<resources>
    <string-array name="myTestList">
        <item>Item 1</item>
        <item>Item 2</item>
    </string-array>
</resources>

Y en preferences.xml agregué:

<preferencecategory app:title="Título de ejemplo">
    <multiselectlistpreference android:entries="@array/myTestList" android:entryvalues="@array/myTestList" android:summary="sí / no" android:title="Título de ejemplo 2"></multiselectlistpreference>
</preferencecategory>

Hasta ahora funciona y con:

val myPreference: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
var sets: MutableSet<string?> = HashSet()
sets = myPreference.getStringSet("myTestList", HashSet<string>()) as MutableSet<string?>
sets.add("Item 3")
myPreference.edit().putStringSet("myTestList", sets).apply()
System.out.println("Nueva lista" + myPreference.getStringSet("myTestList", HashSet<string>()) as MutableSet<string?>)

Lo que hace es tomar los valores del XML predefinido, agregar un nuevo elemento, guardarlo y funciona bien cuando imprimo en la consola.

Pero ahora mi problema: esta nueva lista debería mostrarse en la configuración de la aplicación y aquí no entiendo qué debo hacer para mostrarla en lugar de usar:

android:entries="@array/myTestList"
android:entryValues="@array/myTestList"

Lo cual no funciona ya que esto solo apunta al XML que ahora se ha actualizado.

Espero que se entienda lo que quiero decir, soy principiante y estoy usando este foro por primera vez.

Gracias por tu ayuda.</string?></string?></string?>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mostrar la lista actualizada en la configuración de la aplicación, necesitas generar dinámicamente los arrays de entradas y valores de entrada para MultiSelectListPreference basándote en los valores almacenados en las preferencias compartidas. Aquí tienes un ejemplo de código que puedes utilizar:

    val myPreference: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
    val existingItems = resources.getStringArray(R.array.myTestList)
    val selectedItems = myPreference.getStringSet("myTestList", HashSet<string>()) ?: emptySet<string>()
    val allItems = existingItems.plus(selectedItems.subtract(existingItems))
    val entryList = allItems.toList()
    val entryValueList = allItems.map { it.hashCode().toString() }.toList()
    
    val multiSelectListPref = findPreference<multiselectlistpreference>("tu_clave_pref")
    multiSelectListPref?.entries = entryList.toTypedArray()
    multiSelectListPref?.entryValues = entryValueList.toTypedArray()
    

    En este código, existingItems es la lista de elementos definidos en el archivo XML, selectedItems es el conjunto de elementos agregados programáticamente utilizando preferencias compartidas, y allItems es la combinación de ambos conjuntos con duplicados eliminados.

    Luego, entryList y entryValueList se generan a partir de allItemsentryList contiene las cadenas de visualización para MultiSelectListPreference, y entryValueList contiene identificadores de cadena únicos para cada elemento.

    Finalmente, puedes obtener una referencia a tu MultiSelectListPreference utilizando su clave y establecer sus propiedades entries y entryValues en las listas generadas.

    Asegúrate de reemplazar "tu_clave_pref" con la clave real de tu MultiSelectListPreference.

Comments are closed.