8

アプリの設定アクティビティを作成しようとしています。ユーザーがBluetoothデバイスを選択するためのオブジェクトをPreferenceActivity含む素敵なレイアウトでを定義しました。リストに動的にデータを入力するのに問題がありますListPreference

ListPreferenceアレイアダプタからの値を入力したいと思います(これを作成して、関連するBluetoothデバイス名を入力します)。

これがスピナービューの場合は、と呼ぶことができますsetAdapter()。ただし、ListPreferenceオブジェクトを使用すると、アダプターを接続する方法がわかりませfindviewByIDん(View ToからキャストされないListPreferenceため、オブジェクトへのハンドルを取得することもできません)。

アダプターを接続してから、アダプターに値を入力ListPreferenceします。これにより、値が入力されます。

4

4 に答える 4

10

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

}

MACを設定文字列として保存するために、設定XMLから直接関与することができます。

<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()ますPreferenceActivityPreferenceに戻ってキャストしますListPreference

于 2010-05-30T00:17:09.470 に答える
5

他の誰かが来た場合に備えてこれを更新するだけで、ge0rgの回答は機能しますが、Bluetoothだけでなく、複数の設定を考慮して少し変更しました。また、ペアリングされたデバイスが設定されていないため、エラーが発生しません。 null配列を使用します。

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

もう1つの方法は、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 に答える