Можно ли загрузить элементы ListPreference из адаптера? - PullRequest
8 голосов
/ 30 мая 2010

Я собираюсь создать действие по настройке для моего приложения. Я определил PreferenceActivity с хорошим макетом, включая объект ListPreference, чтобы пользователь мог выбрать устройство Bluetooth. У меня проблемы с динамическим заполнением списка .

Я хотел бы заполнить ListPreference значениями из адаптера массива (который я создам и заполню соответствующими именами устройств Bluetooth).

Если бы это был вид вращения, я мог бы просто позвонить setAdapter(). Однако с объектом ListPreference я не могу понять, как присоединить адаптер (findviewByID не будет приведен из View To ListPreference, поэтому я даже не могу получить указатель на объект).

Я хотел бы подключить адаптер, а затем заполнить адаптер значениями, которые, в свою очередь, заполнили бы значения ListPreference значениями.

Ответы [ 4 ]

10 голосов
/ 26 января 2011

Для особого случая списка устройств Bluetooth вы можете использовать следующий класс:

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" />
7 голосов
/ 30 мая 2010

ListPreference не работает с адаптерами, он работает со строками. См. setEntries() и setEntryValues()

Чтобы позвонить на ListPreference, позвоните findPreference() на свой PreferenceActivity. Примените Preference, к которому вы вернетесь ListPreference.

4 голосов
/ 03 июля 2013

Другим способом было бы переопределить onPrepareDialogBuilder ListPreference и инициализировать setSingleChoiceItems AlertDialog.Builder непосредственно с помощью вашего адаптера:

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 будет работать непосредственно с адаптером, и вам не нужно копировать данные из адаптера, чтобы поместить их в массивы записей.

Найти рабочий образец здесь .

4 голосов
/ 16 июня 2011

Просто обновление на тот случай, если кто-то еще придет, ответ ge0rg работает, но немного изменил его, чтобы учесть несколько предпочтений, а не только Bluetooth, а также, если у них нет настроенных парных устройств, так что вы не получить ошибку с нулевым массивом.

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 для действия предпочтения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...