2010-05-29 12 views
8

Ich möchte eine Einstellungsaktivität für meine App erstellen. Ich habe eine PreferenceActivity mit einem schönen Layout definiert, einschließlich eines Objekts für den Benutzer, um ein Bluetooth-Gerät auszuwählen. Ich habe Probleme beim dynamischen Auffüllen der Liste.Ist es möglich, ListPreference-Elemente von einem Adapter zu laden?

Ich möchte mit Werten von einem Array-Adapter (die ich erstellen und mit relevanten Bluetooth-Gerätenamen füllen) füllen.

Wenn dies eine Spinner Ansicht wäre, könnte ich einfach anrufen setAdapter(). Jedoch mit dem ListPreference Objekt kann ich nicht herausfinden, wie man einen Adapter anbringt (findviewByID wird nicht von View To , so dass ich nicht einmal einen Griff auf das Objekt bekommen).

Ich möchte einen Adapter anhängen und dann den Adapter mit Werten auffüllen, die wiederum die ListPreference mit Werten bevölkern würden.

Antwort

7

funktioniert nicht mit Adaptern, es funktioniert mit Zeichenfolgen. Siehe setEntries() und setEntryValues()

an Ihrem ListPreference zu erhalten, rufen Sie findPreference() auf Ihrem PreferenceActivity. Werfen Sie die Preference Sie zurück auf .

+0

Schön, schön. Vielen Dank! –

10

Für den speziellen Fall einer Liste von Bluetooth-Geräten können Sie die folgende Klasse verwenden:

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

} 

Es kann direkt von Ihrem Prefs XML beteiligt werden, um den MAC als Prefs Zeichenfolge zu speichern:

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

Zunächst einmal: vielen Dank für diesen Code. Es funktioniert gut. aber ich habe ein Renderproblem in der Vorschau in AS. 'Rendering Probleme java.lang.NullPointerException at de.jphjung.speedcamssiegerland.BluetoothDevicePreference. (BluetoothDevicePreference.java:20) bei java.lang.reflect.Constructor.newInstance (Konstruktor.java:423) bei android.preference.GenericInflater.createItem (GenericInflater.java:385) [... und einige mehr ... zu viel für diese Charaktergrenze hier] – beta

4

Nur ein Update zu diesem Fall, wenn jemand anderes kommt, ge0rg Antwort funktioniert, aber änderte es ein wenig zu berücksichtigen, mehrere Vorlieben und nicht nur die Bluetooth-und auch wenn sie keine gepaarten Geräte so eingerichtet haben Erhalte keinen Fehler mit einem Null-Array.

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

`Hoffe, dass dies jemand hilft ... ach ja, und dies wird unter dem onCreate Verfahren für die Bevorzugung Aktivität setzen

4

Ein anderer Weg wäre onPrepareDialogBuilder von ListPreference außer Kraft zu setzen und direkt setSingleChoiceItems von AlertDialog.Builder zu initialisieren mit Ihrem Adapter:

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

Wenn man sich die Android Quellen anschauen, werden Sie feststellen, dass onPrepareDialogBuilder() ruft:

public AlertDialog.Builder setSingleChoiceItems (CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener) 

mit diesen Eingangsarrays. Um ListPreference einige Adapter verwenden (z ArrayAdaper, Adapter Cursor), brauchen Sie nur zu nennen:

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

statt.

Auf diese Weise wird ListPreference direkt auf dem Adapter ausgeführt, und Sie müssen die Daten nicht vom Adapter kopieren, um sie in die Array-Einträge einzufügen.

Suchen Sie eine funktionierende Probe here.

Verwandte Themen