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

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

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

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

#1楼 票数: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" />

#2楼 票数:7 已采纳

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

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

#3楼 票数: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将直接在适配器上运行,您无需从适配器复制数据以将它们放入条目数组中。

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

#4楼 票数: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方法

  ask by Brad Hein translate from so

未解决问题?本站智能推荐:

1回复

是否可以在适配器中设置OnTouchListener并从设置适配器的活动中调用它?

我想在一个由arrayadapter创建并发送到listview的relativelayout上设置一个OnTouchListener。 但是必须将OnTouchListener触发的代码写入设置适配器的活动中。 是否可以将侦听器设置为适配器中的视图,并在活动中定义(或编码)它? 我的适
1回复

ListtoArray适配器

这是我在DatabaseHelper查询 这是我的dataProvider类 这是我在主要活动中的onCreate 我只想将此List结果传递给我的数组适配器。 我是android studio的新手,希望有人可以帮助我。 提前致谢。
1回复

如何从另一个活动(适配器)类重新加载listview

我已经尝试了所有的东西,但是我无法获得正确的结果,我也尝试了 但是当我从列表视图中删除行从其位置删除时我无法获得结果,但是当我更改另一行的值而不是删除过程正常工作但更改的值没有set.getting从数据库中获取值时,我无法获得结果。 这是我的代码,请帮助我,并告诉我我在哪里做错了。
1回复

定制阵列适配器

我正在写一个新闻应用程序,我在显示自定义列表时遇到了一些麻烦。 我想要的是列表项中包含2个TextView: 新闻 - 标题和 新闻说明 它们包含在2个静态数组中:homeScreen.title []和homeScreen.descriptionLong []。 降低你有
2回复

适配器中的Android框架动画

我一直在尝试使帧动画最近能够正常工作。 我在不正确的文档示例中苦苦挣扎,并通过使用onWindowFocusChanged来实现start方法,使其在示例应用程序中运行。 现在,我的问题在于我想在数组适配器中由getView控制的视图上使用它。 应该可以吗? 即 }
1回复

适配器pdf列表视图

我正在尝试创建一个带有图像的列表视图和一个PDF列表以及它们在文件夹中的名称(getexternalstorage / Documents) 所以这是我的Java代码 我检索“ NamePdfList”上的所有路径,即我的getname。 列表正确填写,但设置名称有问题 我尝试了这
1回复

自定义列表适配器仅返回11个项目

我有ListView显示目录中的所有图像。 我为此有一个自定义适配器,它显示所有列表项,但是图像视图是错误的-前11张图像显示正确,其他图像将像前11张图像一样显示。 据我了解,问题出在适配器的data [position]中,因为数据数组正确,而getView中的data [positio
1回复

我可以有两个不同的源将数据传递到阵列适配器吗?

我试图将来自两个不同来源的数据添加到阵列适配器。 一种来源来自包含硬编码字符串的微调器,另一种来源是允许用户创建自己的字符串(通过适配器)传递给数组。 这是下面的代码。 在我看来,根据可以传递给它的参数,阵列适配器只能只允许一个数据源。 在这里,我只能猜测实际的字符串输入是从.....