如何为标准对话框PreferenceFragmentCompat设置Cancelable(false)

时间:2018-11-25 13:23:00

标签: java android dialog preferencescreen

我正在使用PreferenceFragmentCompat显示和设置SharedPreferences。这一切都很好。但是,我的日志中不断出现“ W / InputEventReceiver:试图完成输入事件,但输入事件接收器已被处置。”,因为PreferencesFragmentCompat使用的标准对话框似乎未使用.setCancelable(false)在其showDialog方法中。我想我可以建立自己的自定义对话框,但是仅仅解决这个小问题似乎有点过头了。有什么方法可以简单地覆盖该方法吗?

更新

将其添加到我的PreferencesFragmet(已删除MultiSelectListPreferenceDialogFragmentCompat,因为我不使用它)就足够了

@Override
public void onDisplayPreferenceDialog(Preference pref) {
    DialogFragment dialogFragment = null;
    String DIALOG_FRAGMENT_TAG = "androidx.preference.PreferenceFragment.DIALOG";

    if (pref instanceof EditTextPreference) {
        dialogFragment = EditTextPreferenceDialogFragmentCompat.newInstance(pref.getKey());
    } else if (pref instanceof ListPreference) {
        dialogFragment = ListPreferenceDialogFragmentCompat.newInstance(pref.getKey());
    }

    if (dialogFragment != null) {
        dialogFragment.setTargetFragment(this, 0);
        dialogFragment.setCancelable(false); //adding this!
        if (this.getFragmentManager() != null) {
            dialogFragment.show(this.getFragmentManager(), DIALOG_FRAGMENT_TAG);
        }
    } else {
        super.onDisplayPreferenceDialog(pref);
    }
}

1 个答案:

答案 0 :(得分:1)

我通过PreferenceFramgnetCompat源代码进行了排序,以解决此问题。

不幸的是,您不能在没有回调或覆盖的情况下执行'.setCancelable(false)'对话。

我将通过回调进行解释。

您应该在包含PreferenceFragmentCompat片段的活动上实现“ PreferenceFragmentCompat.OnPreferenceDisplayDialogCallCall”接口。

当用户按下EditTextPreference,ListPreference或AbstractMultiSelectListPreference之一的首选项时,将执行onPreferenceDisplayDialog方法。

执行onPreferenceDisplayDialog方法时,应打开对话框。 幸运的是,共有三种类型的对话框,Google公开提供了这种对话框,因此您无需为其创建自定义对话框。

只需创建对话框实例并调用setCancelable(false)并显示它即可!

请参考以下代码。


class SettingsActivity : FragmentActivity(), PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
        private val DIALOG_FRAGMENT_TAG = "android.support.v7.preference.PreferenceFragment.DIALOG"

        override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)

                supportFragmentManager.beginTransaction()
                                .replace(android.R.id.content, SettingsFragment(), "setting_fragment").commit()
        }

        override fun onPreferenceDisplayDialog(caller: PreferenceFragmentCompat, preference: Preference?): Boolean {
                // check if dialog is already showing
                if (supportFragmentManager!!.findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
                        return true
                }

                val f: DialogFragment
                if (preference is EditTextPreference) {
                        f = EditTextPreferenceDialogFragmentCompat.newInstance(preference.getKey())
                } else if (preference is ListPreference) {
                        f = ListPreferenceDialogFragmentCompat.newInstance(preference.getKey())
                } else if (preference is AbstractMultiSelectListPreference) {
                        f = MultiSelectListPreferenceDialogFragmentCompat.newInstance(preference.getKey())
                } else {
                        throw IllegalArgumentException("Tried to display dialog for unknown " + "preference type. Did you forget to override onDisplayPreferenceDialog()?")
                }

                f.setTargetFragment(supportFragmentManager.findFragmentByTag("setting_fragment"), 0)

                f.isCancelable = false // !! HERE !!

                f.show(supportFragmentManager!!, DIALOG_FRAGMENT_TAG)

                return true
        }
}