Я отсортировал исходный код PreferenceFramgnetCompat, чтобы решить эту проблему.
К сожалению, вы не можете выполнить .setCancelable (false) для диалога без обратного вызова или переопределения.
Я будуобъясните это с помощью обратного вызова.
Вы должны реализовать интерфейс 'PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback' для действия, которое содержит фрагмент PreferenceFragmentCompat.
Когда пользователь нажимает предпочтение одного из EditTextPreference, ListPreference или AbstractMultiSelectLialPreference onogDightDogDirectoryLogPreferenceбыть выполненным.
Когда выполняется метод 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
}
}