2010-05-29 17 views
8

Sto programmando di creare un'attività di impostazioni per la mia app. Ho definito uno PreferenceActivity con un bel layout che include un oggetto ListPreference per consentire all'utente di selezionare un dispositivo Bluetooth. Ho problemi a compilare in modo dinamico l'elenco.È possibile caricare gli oggetti ListPreference da un adattatore?

Desidero popolare ListPreference con valori da un adattatore di array (che creerò e popolerò con i nomi dei dispositivi Bluetooth pertinenti).

Se questa fosse una vista filatore, potrei semplicemente chiamare setAdapter(). Tuttavia con l'oggetto ListPreference non riesco a capire come collegare un adattatore (findviewByID non trasmetterà da Visualizza a ListPreference, quindi non riesco nemmeno a ottenere un handle per l'oggetto).

Vorrei collegare un adattatore e quindi compilare l'adattatore con valori, che a sua volta popoleranno il valore ListPreference con valori.

risposta

7

ListPreference non funziona con gli adattatori, funziona con le stringhe. Vedi setEntries() e setEntryValues()

per arrivare al vostro ListPreference, chiamano findPreference() sul PreferenceActivity. Invia lo Preference al numero ListPreference.

+0

Bello, bello. Grazie! –

10

Per il caso particolare di un elenco di dispositivi Bluetooth, è possibile utilizzare la seguente classe:

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

} 

Può essere coinvolto direttamente dal vostro XML preferenze per memorizzare il MAC come una stringa preferenze:

<de.duenndns.BluetoothDevicePreference 
    android:key="bluetooth_mac" 
    android:title="Bluetooth Device" 
    android:dialogTitle="Choose Bluetooth Device" /> 
+0

Prima di tutto: grazie a tutti per quel pezzo di codice. Funziona bene. ma ho un problema di rendering nell'anteprima di AS. 'Problemi di rendering java.lang.NullPointerException a de.jphjung.speedcamssiegerland.BluetoothDevicePreference. (BluetoothDevicePreference.java:20) su java.lang.reflect.Constructor.newInstance (Constructor.java:423) su android.preference.GenericInflater.createItem (GenericInflater.java:385) [... e altro ancora ... troppo per quel limite di caratteri qui] ' – beta

4

Solo un aggiornamento a questo nel caso in cui qualcun altro arriva, ge0rg risponde funziona ma lo ha cambiato un po 'per prendere in considerazione le preferenze multiple e non solo quella bluetooth e anche se non hanno alcun dispositivo accoppiato impostato in modo da non ottenere un errore con un array nullo.

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

`Spero che questo aiuti qualcuno ... oh, e questo è messo sotto il metodo onCreate per l'attività preferenza

4

Un altro modo sarebbe quello di ignorare onPrepareDialogBuilder di ListPreference e per inizializzare setSingleChoiceItems di AlertDialog.Builder direttamente con la scheda:

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

Se si guardano le sorgenti di Android, ci si accorge che onPrepareDialogBuilder() non chiama:

con tali matrici di entrata. Per rendere ListPreference utilizzare alcuni adattatore (ad esempio ArrayAdaper, CursorAdapter), basta chiamare:

public AlertDialog.Builder setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener) 

invece.

In questo modo ListPreference opererà direttamente sull'adattatore e non è necessario copiare i dati dall'adattatore per inserirli negli array di voci.

Trova un campione funzionante here.

Problemi correlati