8

我正在着手为我的应用程序创建一个设置活动。我已经定义了PreferenceActivity一个很好的布局,包括一个ListPreference供用户选择蓝牙设备的对象。我在动态填充列表时遇到问题

我想填充ListPreference来自数组适配器的值(我将创建并填充相关的蓝牙设备名称)。

如果这是一个微调视图,我可以调用setAdapter(). 但是,对于该ListPreference对象,我无法弄清楚如何附加适配器(findviewByID不会从 View To 投射ListPreference,所以我什至无法获得该对象的句柄)。

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

4

4 回答 4

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" />
于 2011-01-26T02:25:18.517 回答
7

ListPreference不适用于适配器,它适用于字符串。见setEntries()setEntryValues()

要访问您的ListPreference,请findPreference()访问您的PreferenceActivity. 投Preference你回来ListPreference

于 2010-05-30T00:17:09.470 回答
5

只是对此的更新,以防其他人出现,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 方法下

于 2011-06-15T22:03:27.097 回答
4

另一种方法是覆盖ListPreference的 onPrepareDialogBu​​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 将直接对适配器进行操作,您无需从适配器复制数据以将它们放入条目数组中。

在这里找到一个工作样本。

于 2013-07-03T10:00:36.123 回答