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