【问题标题】:How to setCancelable(false) for standard dialog PreferenceFragmentCompat如何为标准对话框 PreferenceFragmentCompat 设置可取消(假)
【发布时间】:2018-11-25 13:23:00
【问题描述】:

我正在使用 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);
    }
}

【问题讨论】:

    标签: java android dialog preferencescreen


    【解决方案1】:

    我整理了 PreferenceFramgnetCompat 源代码来解决这个问题。

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

    我会用回调来解释。

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

    当用户按下 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
            }
    }
    

    【讨论】:

    • 谢谢 antasis9!我不需要实现 PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback,我只需要覆盖 onDisplayPreferenceDialog ...您的代码让我到达那里。非常感谢你。将使用最终代码段更新我的帖子。
    • 是的,很好.. 看到你改了名字:)
    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多