DialogFragment.dismiss () оставляет клавиатуру на экране - PullRequest
0 голосов
/ 09 ноября 2018

Я наблюдаю странное поведение в моем приложении, когда экранная клавиатура задерживается на экране после отклонения DialogFragment, скрывая пользовательский интерфейс действия, несмотря на то, что для действия android:windowSoftInputMode установлено значение adjustResize в мой манифест.

Вот что у меня есть:

  • Активность AppCompatActivity
  • Корневым элементом действия является CoordinatorLayout, который содержит ScrollView с атрибутом android:isScrollContainer="true"
  • В моем файле манифеста это действие имеет атрибут android:windowSoftInputMode="adjustResize"
  • В упражнении есть кнопки, которые вызывают показ android.support.v4.app.DialogFragment, который содержит элемент AutoCompleteTextView.
  • Клавиатура сама по себе не отображается, когда появляется мое диалоговое окно с AutoCompleteTextView, поэтому я обхожу ее, явно показывая клавиатуру в диалоговом окне и скрывая ее перед закрытием диалога.

Моя проблема в том, что скрытие клавиатуры не работает должным образом: после закрытия диалогового окна клавиатура остается, пользовательский интерфейс действия не изменяется, поэтому клавиатура и кнопка навигации «Назад» скрываются. указывает влево, а не вниз, как будто он думал, что клавиатура не отображается Кроме того, последующее нажатие на любые текстовые поля в моем действии приводит к тому, что клавиатура исчезает, как будто клавиатура поняла, что ее там не должно было быть. Когда я комментирую вызов dismiss() и закрываю диалоговое окно, щелкая где-либо за его пределами, я вижу, что клавиатура правильно отключается и все работает как положено.

Соответствующий код для моего определения класса DialogFragment выглядит следующим образом:

 class DualSelectionDialogFragment : DialogFragment() {
    private var input: AutoCompleteTextView? = null
    [...]

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        [...]
        val builder = AlertDialog.Builder(context!!)
        val content = activity?.layoutInflater?.inflate(R.layout.select_dual_mode, null)
        [...]
        input = content?.findViewById<AutoCompleteTextView>(R.id.dual_autocomplete_input)?.apply {
            setAdapter(ArrayAdapter(context, android.R.layout.simple_list_item_1, [...]))
            setOnItemClickListener { _, view, _, _ ->
                [...]
                hideKeyboard(context, this)
                dismiss()
            }
        }
        [...]
        builder.setView(content).setCustomTitle(title)
        return builder.create()
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        dialog.window.setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE +
                WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
    }

    [...]

    fun hideKeyboard(context: Context, view: View) {
        (context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view.windowToken, 0)
    }
}

Я что-то здесь не так делаю?

1 Ответ

0 голосов
/ 02 июля 2019

У меня была похожая проблема с DialogFragment, содержащим два поля editText. Вот мой hideKeyboard метод, вызываемый до вызова dismiss():

fun hideKeyboard(dialog: Dialog) {
        val focusedEditTextView = dialog.currentFocus

        val inputMethodManager = (focusedEditTextView?.context?.getSystemService(Context.INPUT_METHOD_SERVICE)) as InputMethodManager

        if (inputMethodManager.isActive) {
            inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }

Это сработало для меня - проверено на Android 9.1

...