用于 PreferenceFragments 中的 DialogPreferences 的 MaterialAlertDialogBuilder [英] MaterialAlertDialogBuilder for DialogPreferences in PreferenceFragments
问题描述
在首选项屏幕中,我想使用 MaterialComponent 的对话框(使用 MaterialAlertDialogBuilder
)而不是 AppCompat 的 AlertDialog
.但是,AppCompat 的偏好框架使用 AlertDialog.Builder
进行硬编码.
In preference screens, I'd like to use MaterialComponent's dialogs (using MaterialAlertDialogBuilder
) instead of AlertDialog
from AppCompat. However, AppCompat's preference framework hardcodes using the AlertDialog.Builder
.
据我所知,覆盖它的唯一方法是覆盖:PreferenceFragmentCompat.onDisplayPreferenceDialog()
并从该超类中复制一堆逻辑(在显示对话框片段等方面).
From what I can see, the only way to override this is to override: PreferenceFragmentCompat.onDisplayPreferenceDialog()
and copy a bunch of the logic from that superclass (in terms of showing the dialog fragment etc).
这是正确的方法还是有更好的方法?
Is this the correct approach or is there a better way?
推荐答案
这是我对 ListPreference
的解决方案:
Here is my solution for ListPreference
:
class MaterialListPreferenceDialogFragment : ListPreferenceDialogFragmentCompat() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val context: Context? = activity
mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE
val builder = MaterialAlertDialogBuilder(requireActivity())
.setTitle(preference.dialogTitle)
.setIcon(preference.dialogIcon)
.setPositiveButton(preference.positiveButtonText, this)
.setNegativeButton(preference.negativeButtonText, this)
val contentView = onCreateDialogView(context)
if (contentView != null) {
onBindDialogView(contentView)
builder.setView(contentView)
} else {
builder.setMessage(preference.dialogMessage)
}
onPrepareDialogBuilder(builder)
val dialog = builder.create()
//if (needInputMethod()) {
// requestInputMethod(dialog)
//}
return dialog
}
/* Override the methods that access mWhichButtonClicked (because we cannot set it properly here) */
/** Which button was clicked. */
private var mWhichButtonClicked = 0
override fun onClick(dialog: DialogInterface?, which: Int) {
mWhichButtonClicked = which
}
override fun onDismiss(dialog: DialogInterface) {
onDialogClosedWasCalledFromOnDismiss = true
super.onDismiss(dialog)
}
private var onDialogClosedWasCalledFromOnDismiss = false
override fun onDialogClosed(positiveResult: Boolean) {
if (onDialogClosedWasCalledFromOnDismiss) {
onDialogClosedWasCalledFromOnDismiss = false
// this means the positiveResult needs to be calculated from our mWhichButtonClicked
super.onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE)
} else {
super.onDialogClosed(positiveResult)
}
}
}
fun PreferenceFragmentCompat.showListPreferenceDialog(preference: ListPreference) {
val dialogFragment = MaterialListPreferenceDialogFragment().apply {
arguments = Bundle(1).apply {
putString("key", preference.key)
}
}
dialogFragment.setTargetFragment(this, 0)
dialogFragment.show(parentFragmentManager, "androidx.preference.PreferenceFragment.DIALOG")
}
然后在 PreferenceFragmentCompat
子类中:
override fun onDisplayPreferenceDialog(preference: Preference) {
if (preference is ListPreference) {
showListPreferenceDialog(preference)
} else {
super.onDisplayPreferenceDialog(preference)
}
}
欢迎反馈!
这篇关于用于 PreferenceFragments 中的 DialogPreferences 的 MaterialAlertDialogBuilder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!