如何解决在 PreferenceFragmentCompat
我想要实现的是拥有一个列表,其中包含对 Preference 打开的所有对话框的引用(可以是 EditTextPreference、ListPreference ...)。然后,当设备屏幕被停用时,我希望能够关闭 (.dismiss()) 所有打开的对话框。
这是 PreferenceFragmentCompat 的示例布局文件:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<PreferenceCategory
android:layout_marginTop="0dp"
android:gravity="top"
android:key="settings_example_category">
<!--
<EditTextPreference
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:key="settings_example_text"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/settings_example_title"
app:useSimpleSummaryProvider="true" />
-->
<Preference
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:key="settings_example_text"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/settings_example_title"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:defaultValue="15"
android:dialogTitle="@string/location_update_time"
android:entries="@array/location_update_time_interval_entries"
android:entryValues="@array/location_update_time_interval_entry_values"
android:key="settings_connection_location_update_time"
android:title="@string/location_update_time"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
我设法通过将其更改为 Preference 并创建 Dialog 并在我的 ExampleSettingsFragment.kt 中像这样处理保存自己来使其为 EditTextPreference 工作(请参阅 initPreferenceHelper() 函数):
class ExampleSettingsFragment : PreferenceFragmentCompat(),Preference.OnPreferenceClickListener,SharedPreferences.OnSharedPreferencechangelistener {
private var sharedPref: SharedPreferences? = null
[...]
// region Helper methods
/**
* This function can init a Preference. [preferenceKey] must be the android:key
* this setting will be saved under. The defaultvalue is the default value the setting is set to,* if it is not explicit set by the user. Use "" if there is no default for this setting necessary.
*/
private fun initPreferenceHelper(preferenceKey : String,defaultValue : String) {
Timber.d("initPreferenceHelper(): $preferenceKey initialized!")
val preference = findPreference<Preference>(preferenceKey)!!
sharedPref = PreferenceManager.getDefaultSharedPreferences(requireActivity())
val editText = EditText(context)
editText.setText(sharedPref!!.getString(GlobalConstants.CONNECTION_SETTINGS_MEDICAL_DEVICE_ID,defaultValue),TextView.BufferType.EDITABLE)
val dialog = AlertDialog.Builder(requireContext())
.setTitle(preference.title)
.setView(editText)
.setPositiveButton(getString(R.string.ok),DialogInterface.OnClickListener { dialog,which ->
if (which.equals(DialogInterface.BUTTON_POSITIVE)) {
//save
val userinput : String = editText.text.toString()
sharedPref = PreferenceManager.getDefaultSharedPreferences(requireActivity())
sharedPref!!.edit().putString(preferenceKey,userinput).apply()
if(userinput.isNotEmpty()) {
preference.summary = userinput
} else {
preference.summary = getString(R.string.not_set_summary)
}
}
dialog.dismiss()
})
.setNegativeButton(getString(R.string.cancel),which ->
dialog.dismiss()
})
.setCancelable(true).create()
//in the next line we register this dialog to bis dismissable later
SettingsAlertDialogHelper.register(dialog)
val value = sharedPref!!.getString(preferenceKey,defaultValue)
if (value.isNullOrEmpty()) {
preference.summary = getString(R.string.not_set_summary)
} else {
preference.summary = value
}
preference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
Timber.d("$preferenceKey clicked!")
dialog.show()
return@OnPreferenceClickListener true
}
}
private fun initializeSettings() {
initPreferenceHelper("settings_example_text","")
}
// endregion
}
我会跟踪所有对话框,并且可以使用这个助手类成功关闭它们:
class SettingsAlertDialogHelper {
companion object {
private var dialogs : MutableList<AlertDialog> = mutablelistof()
/**
* please register all [alertDialog]s used in Settings with this
* function. Then they can be properly dismissed.
*/
public fun register(alertDialog: AlertDialog) {
dialogs.add(alertDialog)
Timber.d("{register()} all currently registered Dialogs: ${dialogs.toString()}")
}
[...]
/**
* This function dismisses all registered and open dialogs and should be called each time the admin rights are gone
*/
public fun dismissAllOpenDialogs() {
val open = dialogs.filter { it.isShowing }
open.forEach {
it.dismiss()
}
}
}
}
我现在遇到的问题是我不知道如何为所有不是 EditTextPreference 的首选项执行此操作。例如,您可以在第一个代码片段中看到的 ListPreference。
由于所有带有像 EditTextPreference 或 ListPreference 这样的对话框的 Preferences 似乎以某种方式从 DialogPreference 派生,它在内部似乎也使用 PreferenceFragmentCompat 我想知道是否有可能以某种方式迭代像 ExampleSettingsFragment 这样的 PreferenceFragmentCompat。 kt 以获取对 Preferences 使用的所有 Dialogs 的引用,或者能够以其他方式关闭它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。