Adnroid SettingsActivity以编程方式增加ListPreference的数量

问题描述 投票:0回答:2

如何从ListPreference编程而不是静态地填充arrays.xml的项目?

SettingsActivity.kt

class SettingsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.settings_activity)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings, SettingsFragment())
            .commit()
        supportActionBar?.setDisplayHomeAsUpEnabled(true)

// Do something here to populate the ListPreference bluetoothName...
    }

    class SettingsFragment : PreferenceFragmentCompat() {
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
           setPreferencesFromResource(R.xml.root_preferences, rootKey)
// ... or here?
// (WTF is a Fragment anyway?)
        }
    }
}

root_preferences.xml

<?xml version="1.0" encoding="utf-8"?>
    <androidx.preference.PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <androidx.preference.ListPreference
        app:dialogTitle="Select bluetooth adapter"
        app:key="bluetoothName"
        app:summary="%s"
        app:title="Bluetooth adapter" />
    <androidx.preference.ListPreference
        app:dialogTitle="Select units"
        app:entries="@array/units_names"
        app:entryValues="@array/units_values"
        app:key="units"
        app:summary="%s"
        app:title="Units"
        />
</androidx.preference.PreferenceScreen>
android-preferences
2个回答
0
投票

这似乎适用于填充项目,但是当用户选择一个项目时,应用程序就会崩溃

    Process: com.rwb.psamfd, PID: 23596
    java.lang.ArrayIndexOutOfBoundsException: length=0; index=1
        at androidx.preference.ListPreferenceDialogFragmentCompat.onDialogClosed(ListPreferenceDialogFragmentCompat.java:105)
        at androidx.preference.PreferenceDialogFragmentCompat.onDismiss(PreferenceDialogFragmentCompat.java:265)
        at androidx.fragment.app.DialogFragment$3.onDismiss(DialogFragment.java:120)
        at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1323)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

他妈的知道那是什么意思。

[您似乎必须给ListPreference一个@array/,否则会得到IllegalStateException: ListPreference requires an entries array and an entryValues array.

    <androidx.preference.ListPreference
        app:dialogTitle="Select bluetooth adapter"
        app:key="bluetoothName"
        app:entries="@array/empty"
        app:entryValues="@array/empty"
        app:summary="%s"
        app:title="Bluetooth adapter" />
    <string-array name="empty"></string-array>
class SettingsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // get bluetooth devices
        var cs: Array<CharSequence> = arrayOf("")
        try {
            val bt: BluetoothManager =
                getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager;
            val bta: BluetoothAdapter = bt.adapter;
            val pairedDevices: Set<BluetoothDevice> = bta.bondedDevices
            cs = pairedDevices.map { z -> z.name }.toTypedArray()
        }
        catch(e:Exception) {}

        // Start the fragment
        setContentView(R.layout.settings_activity)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings, SettingsFragment(cs))
            .commit()
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
    }

    class SettingsFragment(adapters: Array<CharSequence>) : PreferenceFragmentCompat() {
        private var adapters: Array<CharSequence> = adapters

        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
           setPreferencesFromResource(R.xml.root_preferences, rootKey)

            val p:ListPreference? = findPreference<ListPreference>("bluetoothName")
            p?.setEntries(adapters)

        }
    }
}

0
投票

证明您需要

            p?.setEntryValues(adapters)

也是。

© www.soinside.com 2019 - 2024. All rights reserved.