我正准备为我的应用创建设置活动。我已经定义了一个PreferenceActivity
,其布局很好,包括ListPreference
对象,供用户选择蓝牙设备。 我无法动态填充列表。
我想使用数组适配器(我将创建并填充相关的蓝牙设备名称)的值填充ListPreference
。
如果这是一个微调视图,我可以调用setAdapter()
。但是对于ListPreference
对象,我无法弄清楚如何附加适配器(findviewByID
不会从View To ListPreference
转换,所以我甚至无法获得宾语)。
我想附加一个适配器,然后用适当的值填充适配器,然后使用值填充ListPreference
。
答案 0 :(得分:10)
对于蓝牙设备列表的特殊情况,您可以使用以下类:
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);
}
}
可以直接从您的prefs XML中将MAC存储为prefs字符串:
<de.duenndns.BluetoothDevicePreference
android:key="bluetooth_mac"
android:title="Bluetooth Device"
android:dialogTitle="Choose Bluetooth Device" />
答案 1 :(得分:7)
ListPreference
不适用于适配器,它适用于字符串。请参阅setEntries()
和setEntryValues()
要点击ListPreference
,请拨打PreferenceActivity
上的findPreference()
。将Preference
转换为ListPreference
。
答案 2 :(得分:4)
只是一个更新到这个以防其他人出现,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方法
答案 3 :(得分:4)
另一种方法是覆盖ListPreference的onPrepareDialogBuilder并使用您的适配器直接初始化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源代码,您会发现onPrepareDialogBuilder()会调用:
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将直接在适配器上运行,您无需从适配器复制数据以将它们放入条目数组中。
找到工作样本here。