¿Es posible cargar elementos ListPreference desde un adaptador?
Me propongo crear una actividad de configuración para mi aplicación. He definido una PreferenceActivity
con un diseño agradable que incluye un objeto ListPreference
para que el usuario seleccione un dispositivo bluetooth. Tengo problemas para rellenar dinámicamente la lista .
Me gustaría rellenar ListPreference
con los valores de un adaptador de matriz (que crearé y relleno con los nombres de dispositivos Bluetooth relevantes).
- ¿Cuál es la mejor manera de tratar con el objeto JSON?
- Pantalla de preferencia El diseño personalizado sólo funciona con el segundo clic
- Cómo instanciar el diseño para las preferencias personalizadas, utilizando android: atributo de diseño
- Cómo agregar iconos a Preferencias
- Android: ¿Cómo puede hacer PreferenceScreen personalizado?
Si esto fuera un spinner View, podría simplemente llamar a setAdapter()
. Sin embargo, con el objeto ListPreference
no puedo averiguar cómo adjuntar un adaptador ( findviewByID
no emitirá desde View To ListPreference
, por lo que ni siquiera puedo obtener un identificador para el objeto).
Me gustaría adjuntar un adaptador y luego rellenar el adaptador con valores, que a su vez se llenar el ListPreference
con valores.
- Las preferencias compartidas de Android no se guardan
- Android: Cómo obtener eliminar margen / relleno en la pantalla de preferencias
- Preferencias anidadas en una lista dinámica de preferencias en Android
- Cómo configurar java.util.logging.logger en android para utilizar un archivo de propiedades de registro situado en la tarjeta SD?
- No puedo averiguar cómo usar un android PreferenciaActividad
- ¿Cómo personalizar el tema de la pantalla de preferencias para que parezca eso?
- ¿Cómo agregar la categoría en el encabezado de preferencia?
- ¿Cómo validar el formato y los valores de EditTextPreference introducidos en Android 2.1?
ListPreference
no funciona con adaptadores, funciona con cadenas. Consulte setEntries()
y setEntryValues()
Para llegar a ListPreference
, llame a findPreference()
en su PreferenceActivity
. ListPreference
la Preference
que regresa a ListPreference
.
Para el caso especial de una lista de dispositivos bluetooth, puede utilizar la siguiente clase:
package de.duenndns; import android.bluetooth.*; import android.content.Context; import android.preference.ListPreference; import android.util.AttributeSet; import java.util.Set; public class BluetoothDevicePreference extends ListPreference { public BluetoothDevicePreference(Context context, AttributeSet attrs) { super(context, attrs); BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> pairedDevices = bta.getBondedDevices(); CharSequence[] entries = new CharSequence[pairedDevices.size()]; CharSequence[] entryValues = new CharSequence[pairedDevices.size()]; int i = 0; for (BluetoothDevice dev : pairedDevices) { entries[i] = dev.getName(); if (entries[i] == null) entries[i] = "unknown"; entryValues[i] = dev.getAddress(); i++; } setEntries(entries); setEntryValues(entryValues); } public BluetoothDevicePreference(Context context) { this(context, null); } }
Puede estar involucrado directamente desde su XML prefs para almacenar el MAC como cadena de prefs:
<de.duenndns.BluetoothDevicePreference android:key="bluetooth_mac" android:title="Bluetooth Device" android:dialogTitle="Choose Bluetooth Device" />
Sólo una actualización de este caso en caso de que alguien viene, la respuesta ge0rg funciona, pero lo cambió un poco para tener en cuenta las preferencias múltiples y no sólo el bluetooth y también si no tienen ningún dispositivo emparejado configurado para que usted no recibe un error Con una matriz nula.
ListPreference BTList = (ListPreference) findPreference("your preference key"); BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); CharSequence[] entries = new CharSequence[1]; CharSequence[] entryValues = new CharSequence[1]; entries[0] = "No Devices"; entryValues[0] = ""; if(pairedDevices.size() > 0){ entries = new CharSequence[pairedDevices.size()]; entryValues = new CharSequence[pairedDevices.size()]; int i=0; for(BluetoothDevice device : pairedDevices){ entries[i] = device.getName(); entryValues[i] = device.getAddress(); i++; } } BTList.setEntries(entries); BTList.setEntryValues(entryValues);
`Espero que esto ayude a alguien … oh y esto se pone bajo el método onCreate para la actividad de preferencia
Otra forma sería anular onPrepareDialogBuilder de ListPreference y inicializar setSingleChoiceItems de AlertDialog.Builder directamente con su adaptador:
public class AdapterListPreference extends ListPreference { @Override protected void onPrepareDialogBuilder( AlertDialog.Builder builder ) { // don't call super.onPrepareDialogBuilder() because it'll check // for Entries and set up a setSingleChoiceItems() for them that // will never be used final ListAdapter adapter = …; builder.setSingleChoiceItems( adapter, 0, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which ) { // adapter.getItemId( which ) dialog.dismiss(); } } ); builder.setPositiveButton( null, null ); } }
Si miras las fuentes de Android, verás que onPrepareDialogBuilder () llama:
public AlertDialog.Builder setSingleChoiceItems (CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener)
Con esos arrays de entrada. Para hacer que ListPreference utilice algún adaptador (por ejemplo, ArrayAdaper, CursorAdapter), sólo tiene que llamar a:
public AlertDialog.Builder setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener)
en lugar.
De esta manera ListPreference funcionará directamente en el adaptador y no es necesario copiar los datos del adaptador para colocarlos en las matrices de entradas.
Encuentre aquí una muestra de trabajo.