如何从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>
这似乎适用于填充项目,但是当用户选择一个项目时,应用程序就会崩溃
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)
}
}
}
证明您需要
p?.setEntryValues(adapters)
也是。