Как проверить видимость программной клавиатуры в Android?

Пункты в HTML 5, относящиеся к последнему рабочему проекту, определяются как элементы потока, которые могут содержать только фразирующие элементы. Списки также определяются как элементы потока и не могут быть заключены в параграфы. Что бы вы ни думали, определение параграфа должно быть, это формальное определение термина в HTML, и я думаю, что это вряд ли изменится.

Есть две возможности, которые вы могли бы рассмотреть, помимо двух вы упомянутый:

  • Рассмотрите возможность достижения более широкомасштабного элемента потока, чем абзац, если он применяется, например section, nav, header, footer или article .
  • Используйте гибридный подход: заверните последовательность p – ol – p с помощью div по вашему выбору, который применяет общее форматирование к набору.

Что касается div, спецификатор HTML 5 явно рекомендует, чтобы он был элементом «последней инстанции», поскольку он не несет семантического значения в том, как это делают другие элементы HTML, и может быть не таким удобным для пользователей в альтернативных пользовательских агентах. Следуя этим советам, я бы не использовал div за счет p для основного текста, если семантика важна для вас. Однако, это может быть полезно, чтобы убедиться, что использование нескольких абзацев не слишком визуально изменено.

489
задан Ironman 3 July 2016 в 07:03
поделиться

3 ответа

99% решений здесь основаны на вероятности РАЗМЕРА ОКНА IME, и каждым таким решением является sh... ценность!

, потому что:

  1. ОВЕРЛЕЙНЫЕ ПРОГРАММЫ - из Пользовательских приложений или Системных приложений
  2. IME не имеют никакого МИНИМАЛЬНОГО РАЗМЕРА, это может взять 100% размера окна и может быть так же тонко как воображение реализации разработчика :)
  3. окна MODAL / окна MULTI
  4. , и еще много не нравится знание IPC (например: внешнее окно или его обнаружение содержания)

настолько предполагающий это - IME, является всегда неправильным - не предполагают быть уверенным!!!

@kevin-du мастер лучшего решения теперь как его запрос IMM для высоты IME - но поскольку это сказало, что методом является скрытый API, настолько использующий, это могло быть опасно в способе получить неправильные "ложные отрицательные результаты" - несправедливостью dev использование.

0
ответ дан 22 November 2019 в 22:37
поделиться

Что касается этот ответ @TacB0sS я разработал один класс в Kotlin. Надежда это будет полезно. Сообщите мне, требуется ли некоторое улучшение.

class KeyboardVisibilityObserver(val layRootContainer: View?, val keyboardVisibilityListener: KeyboardVisibilityListener?) {
    var isKeyboardOpen = false
        private set

    private var keyBoardObserver = object : ViewTreeObserver.OnGlobalLayoutListener {

        private val DefaultKeyboardDP = 100

        // Lollipop includes button bar in the root. Add height of button bar (48dp) to maxDiff
        private val EstimatedKeyboardDP = DefaultKeyboardDP + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 48 else 0

        private val r = Rect()

        override fun onGlobalLayout() {
            if (layRootContainer != null) {
                // Convert the dp to pixels.
                val estimatedKeyboardHeight = TypedValue
                        .applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP.toFloat(), layRootContainer.resources.displayMetrics).toInt()

                // Conclude whether the keyboard is shown or not.
                layRootContainer.getWindowVisibleDisplayFrame(r)
                val heightDiff = layRootContainer.rootView.height - (r.bottom - r.top)
                val isShown = heightDiff >= estimatedKeyboardHeight

                if (isShown == isKeyboardOpen) {
                    //  Log.d("Keyboard state", "Ignoring global layout change...");
                    return
                }

                isKeyboardOpen = isShown

                keyboardVisibilityListener?.onKeyboardVisibilityChanged(isKeyboardOpen)
            }
        }
    }

    init {
        layRootContainer?.viewTreeObserver?.addOnGlobalLayoutListener(keyBoardObserver)
    }

    // call this in onDestroy
    fun removeObserver(){
        layRootContainer?.viewTreeObserver?.removeOnGlobalLayoutListener(keyBoardObserver)
    }

    interface KeyboardVisibilityListener {
        fun onKeyboardVisibilityChanged(isKeyboardOpen: Boolean)
    }
}
0
ответ дан 22 November 2019 в 22:37
поделиться

Вход MethodManager имеет информацию о программной клавиатуре. Вы получаете его от деятельности через:

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))

Вы можете играть с этим, чтобы увидеть, что он может вам сказать. Вы можете использовать его, чтобы показать или скрыть мягкий вход ...

-2
ответ дан 22 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: