Как установить Cancelable (false) для стандартного диалога PreferenceFragmentCompat - PullRequest
0 голосов
/ 25 ноября 2018

Я использую 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 голосов
/ 25 ноября 2018

Я отсортировал исходный код 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
        }
}
...