2010-05-29 14 views
8

Uygulamam için bir ayar etkinliği oluşturmaya gidiyorum. Kullanıcının bir bluetooth cihazı seçmesi için ListPreference nesnesini içeren güzel bir düzen ile PreferenceActivity tanımladım. Dinamik olarak listesini doldurarak sorun yaşıyorum.ListPreference öğelerini bir adaptörden yüklemek mümkün mü?

numaralı bir dizi bağdaştırıcısından ListPreference (ilgili bluetooth aygıt adlarıyla oluşturduğum ve dolduracağım) değerlerle doldurmak istiyorum.

Bu bir çevirici görünümüyse, setAdapter() numaralı telefonu arayabilirim. Ancak, ListPreference nesnesi ile bir bağdaştırıcıyı nasıl ekleyeceğimi anlayamıyorum (findviewByID View To ListPreference, bu nedenle nesneye bir tanıtıcı bile alamıyorum).

Bir bağdaştırıcı eklemek ve daha sonra da ListPreference değerini değerlerle doldurmak için bağdaştırıcıyı değerlerle doldurmak istiyorum.

cevap

7

ListPreference, bağdaştırıcılarla çalışmaz, dizelerle çalışır. setEntries() ve

setEntryValues(), senin ListPreference almak için PreferenceActivity üzerinde findPreference() aramak için Bkz. Preference'u yayınlayın, ListPreference'a geri dönün.

: Bu bir prefs dizesi olarak MAC saklamak için prefs XML doğrudan dahil edilebilir

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

} 

: bluetooth cihazların bir listesi özel durumları için

+0

Güzel, güzel. Teşekkür ederim! –

10

, aşağıdaki sınıfını kullanabilirsiniz
<de.duenndns.BluetoothDevicePreference 
    android:key="bluetooth_mac" 
    android:title="Bluetooth Device" 
    android:dialogTitle="Choose Bluetooth Device" /> 
+0

Her şeyden önce, bu kod parçası için hepinize teşekkür ederim. İyi çalışıyor. ama ben AS içinde önizlemede bir oluşturma sorunu var. Sorun Giderme java.lang.NullPointerException de.jphjung.speedcamssiegerland.BluetoothDevicePreference. Android.preference.GenericInflater.createItem (GenericInflater.java:385) adresindeki java.lang.reflect.Constructor.newInstance (Constructor.java:423) adresinden (BluetoothDevicePreference.java:20) [... ve daha fazlası ... Burada bu karakter sınırı için çok fazla] ' – beta

4

Bir başkasının ortaya çıkması halinde sadece bir Güncelleme, ge0rg cevap çalışır, ancak sadece bluetooth olanı değil, aynı zamanda eşleştirilmiş cihazların ayarlanmamış birden fazla tercihini de dikkate almak için biraz değiştirdi. boş bir dizi ile bir hata alma.

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

`

4

başka yolu da ListPreference ait onPrepareDialogBuilder geçersiz olacaktır ve doğrudan AlertDialog.Builder ait setSingleChoiceItems başlatmak için bu kimse yardımcı olur umarım ... oh ve bu tercih aktivite için onCreate yöntemle altında konur adaptörünüzle birlikte: Android kaynaklardan bakarsak

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

, sen onPrepareDialogBuilder() çağrısı olmadığını göreceksiniz:

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

.

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

yerine: ListPreference bazı adaptörü (örn ArrayAdaper, CursorAdapter) kullanmak yapmak için, sadece aramak gerekir.

Bu şekilde, ListPreference doğrudan bağdaştırıcı üzerinde çalışır ve verileri girişler dizisine yerleştirmek için bağdaştırıcıdan kopyalamanız gerekmez.

Çalışma örneğini bulun here.

İlgili konular