首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >适用于PreferenceFragments中DialogPreferences的MaterialAlertDialogBuilder

适用于PreferenceFragments中DialogPreferences的MaterialAlertDialogBuilder
EN

Stack Overflow用户
提问于 2020-04-25 18:15:08
回答 2查看 495关注 0票数 4

在首选项屏幕中,我想使用MaterialComponent的对话框(使用MaterialAlertDialogBuilder),而不是AppCompat中的AlertDialog。但是,AppCompat的首选框架使用AlertDialog.Builder进行硬编码。

在我看来,覆盖它的唯一方法是覆盖:PreferenceFragmentCompat.onDisplayPreferenceDialog()并从超类复制一堆逻辑(就显示对话框片段而言)。

这是正确的方法,还是有更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2020-04-25 19:25:51

以下是我对ListPreference的解决方案

代码语言:javascript
运行
复制
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子类中:

代码语言:javascript
运行
复制
override fun onDisplayPreferenceDialog(preference: Preference) {
    if (preference is ListPreference) {
        showListPreferenceDialog(preference)
    } else {
        super.onDisplayPreferenceDialog(preference)
    }
}

欢迎反馈!

票数 2
EN

Stack Overflow用户

发布于 2020-05-25 16:22:14

对我来说,将这个添加到我的主题中会使首选项对话框出现在材质设计中:

代码语言:javascript
运行
复制
<item name="alertDialogTheme">@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog</item>

至少字体和颜色正在调整,但是对话框的边角仍然不像来自MaterialAlertDialogBuilder的on那样圆润

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61424109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档