是否有可能从适配器加载ListPreference项目?

我开始为我的应用程序创build一个设置活动。 我已经定义了一个PreferenceActivity与一个不错的布局,包括一个ListPreference对象,供用户select一个蓝牙设备。 我在dynamic填充列表时遇到问题

我想用一个数组适配器 (我将创build并填充相关的蓝牙设备名称)中的值填充ListPreference

如果这是一个微调视图,我可以调用setAdapter() 。 然而与ListPreference对象我无法弄清楚如何附加一个适配器( findviewByID不会从视图转换为ListPreference ,所以我甚至不能得到一个对象的句柄)。

我想附加一个适配器,然后使用值填充适配器,这又将用值填充ListPreference

Solutions Collecting From Web of "是否有可能从适配器加载ListPreference项目?"

ListPreference不适用于适配器,它适用于string。 请参阅setEntries()setEntryValues()

要获取ListPreference ,请在PreferenceActivity上调用findPreference() 。 将PreferenceListPreference

对于蓝牙设备列表的特殊情况,您可以使用以下类:

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

它可以直接从您的首选项XML中介入,将MAC存储为首选项string:

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

只是一个更新,以防其他人出现的情况下,ge0rg答案的作品,但改变了一点考虑到多个偏好,而不仅仅是蓝牙之一,也如果他们没有任何配对的设备设置,所以你不会得到一个错误与一个空数组。

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

“希望这可以帮助别人…哦,这是根据偏好活动的onCreate方法

另一种方法是覆盖ListPreference的PrepareDialogBu​​ilder,并用你的适配器直接初始化AlertDialog.Builder的setSingleChoiceItems:

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

如果你看看Android的源代码,你会发现onPrepareDialogBu​​ilder()调用:

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

与那些入口数组。 为了使ListPreference使用一些适配器(例如ArrayAdaper,CursorAdapter),你只需要调用:

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

代替。

通过这种方式,ListPreference将直接在适配器上运行,并且不需要将适配器中的数据复制到条目数组中。

在这里find一个工作示例。