在首选项屏幕中,我想使用MaterialComponent的对话框(使用MaterialAlertDialogBuilder
),而不是AppCompat中的AlertDialog
。但是,AppCompat的首选框架使用AlertDialog.Builder
进行硬编码。
在我看来,覆盖它的唯一方法是覆盖:PreferenceFragmentCompat.onDisplayPreferenceDialog()
并从超类复制一堆逻辑(就显示对话框片段而言)。
这是正确的方法,还是有更好的方法?
发布于 2020-04-25 19:25:51
以下是我对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)
}
}
欢迎反馈!
发布于 2020-05-25 16:22:14
对我来说,将这个添加到我的主题中会使首选项对话框出现在材质设计中:
<item name="alertDialogTheme">@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog</item>
至少字体和颜色正在调整,但是对话框的边角仍然不像来自MaterialAlertDialogBuilder的on那样圆润
https://stackoverflow.com/questions/61424109
复制相似问题