代码之家  ›  专栏  ›  技术社区  ›  Brad Hein

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

  •  8
  • Brad Hein  · 技术社区  · 15 年前

    PreferenceActivity 有一个很好的布局,包括 ListPreference 动态填充列表时遇到问题

    我想填充 列表首选项 使用来自数组适配器的值 (我将创建并填充相关的蓝牙设备名称)。

    setAdapter() . 然而,随着 对象我不知道如何连接适配器( findviewByID 不会从视野投射到 列表首选项 ,所以我连对象的句柄都拿不到)。

    列表首选项 有价值观。

    4 回复  |  直到 15 年前
        1
  •  7
  •   CommonsWare    15 年前

    ListPreference 不适用于适配器,它适用于字符串。看到了吗 setEntries() setEntryValues()

    为了得到你的 列表首选项 findPreference() PreferenceActivity . 投出 Preference 你回去吧 列表首选项 .

        2
  •  10
  •   ge0rg    9 年前

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

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

    <de.duenndns.BluetoothDevicePreference
        android:key="bluetooth_mac"
        android:title="Bluetooth Device"
        android:dialogTitle="Choose Bluetooth Device" />
    
        3
  •  5
  •   DRing    14 年前

    这只是一个更新,以防别人来了,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);
    

        4
  •  4
  •   mf511    12 年前

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

    相反。

    找到工作样本 here