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



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

更新:

将其添加到我的首选项Fragmet(删除了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);
}
}

为了解决这个问题,我对PreferenceFramgnetCompat源代码进行了排序。

很遗憾,在没有回调或重写的情况下,无法对对话框执行".setCanceable(false("。

我会用回拨来解释的。

您应该在包含PreferenceFragmentCompat片段的活动上实现"PreferencesFragmentCompat.OnPreferencesDisplayDialogCallback"接口。

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

当执行onPreferenceDisplayDialog方法时,应该打开对话框。幸运的是,有三种类型的对话框,谷歌通过公共方式提供,所以你不需要为它们制作自定义对话框。

只需创建对话框的实例并调用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
}
}

相关内容

最新更新