是否可以从适配器加载ListPreference项?

时间:2010-05-29 23:15:46

标签: android arrays preferences adapter

我正准备为我的应用创建设置活动。我已经定义了一个PreferenceActivity,其布局很好,包括ListPreference对象,供用户选择蓝牙设备。 我无法动态填充列表

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

如果这是一个微调视图,我可以调用setAdapter()。但是对于ListPreference对象,我无法弄清楚如何附加适配器(findviewByID不会从View To ListPreference转换,所以我甚至无法获得宾语)。

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

4 个答案:

答案 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源代码,您会发现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将直接在适配器上运行,您无需从适配器复制数据以将它们放入条目数组中。

找到工作样本here