用于 PreferenceFragments 中的 DialogPreferences 的 MaterialAlertDialogBu​​ilder [英] MaterialAlertDialogBuilder for DialogPreferences in PreferenceFragments

查看:39
本文介绍了用于 PreferenceFragments 中的 DialogPreferences 的 MaterialAlertDialogBu​​ilder的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在首选项屏幕中,我想使用 MaterialComponent 的对话框(使用 MaterialAlertDialogBu​​ilder)而不是 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 的 MaterialAlertDialogBu​​ilder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆