Android Пользовательская клавиатура не работает в BottomSheetDialogFragment - PullRequest
0 голосов
/ 16 января 2020

Я создал пользовательскую клавиатуру, и она работает в действии и фрагмент.

Но, к сожалению, это не работает в нижнем диалоговом окне. Когда я нажимаю клавишу, с моим текстом редактирования ничего не происходит.

Вот мой код:

Ключ Xml

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:horizontalGap="3px"
    android:keyWidth="10%p"
    android:keyHeight="60dp"
    android:keyBackground="@color/colorPrimary"
    android:keyTextColor="@color/colorWhite"
    android:verticalGap="5px">
    <Row>
        <Key
            android:codes="8"
            android:keyEdgeFlags="left"
            android:keyLabel="1" />

        <Key
            android:codes="9"
            android:keyLabel="2" />

        <Key
            android:codes="10"
            android:keyLabel="3" />

        <Key
            android:codes="11"
            android:keyLabel="4" />

        <Key
            android:codes="12"
            android:keyLabel="5" />

        <Key
            android:codes="13"
            android:keyLabel="6" />

        <Key
            android:codes="14"
            android:keyLabel="7" />

        <Key
            android:codes="15"
            android:keyLabel="8" />

        <Key
            android:codes="16"
            android:keyLabel="9" />

        <Key
            android:codes="7"
            android:keyLabel="0" />

        <Key
            android:codes="67"
            android:isRepeatable="true"
            android:keyWidth="10%p"
            android:keyEdgeFlags="right"
            android:keyIcon="@drawable/ic_backspace" />
    </Row>
</Keyboard>

Мой слушатель клавиатуры: Ниже приведен код моего слушателя клавиатуры, и я думаю, что проблема в targetActivity.dispatchKeyEvent(event). Но я не могу отправить диспетчерский ключ к контексту.

class BasicOnKeyboardActionListener(
    private val targetActivity: Activity,
    private val keyboardView: KeyboardView
) : KeyboardView.OnKeyboardActionListener {

    override fun swipeRight() {

    }

    override fun onPress(p0: Int) {
    }

    override fun onRelease(p0: Int) {
    }

    override fun swipeLeft() {
    }

    override fun swipeUp() {
    }

    override fun swipeDown() {
    }

    override fun onKey(primaryCode: Int, p1: IntArray?) {
        val eventTime = System.currentTimeMillis()
        val event = KeyEvent(
            eventTime, eventTime, KeyEvent.ACTION_DOWN, primaryCode, 0, 0, 0, 0,
            KeyEvent.FLAG_SOFT_KEYBOARD or KeyEvent.FLAG_KEEP_TOUCH_MODE
        )

        targetActivity.dispatchKeyEvent(event)
    }

    override fun onText(p0: CharSequence?) {
    }

    fun registerEditText(edittext: EditText) {
        with(edittext) {
            addTextChangedListener(object : TextWatcher {
                override fun beforeTextChanged(
                    s: CharSequence,
                    start: Int,
                    count: Int,
                    after: Int
                ) {
                }

                override fun onTextChanged(
                    s: CharSequence,
                    start: Int,
                    before: Int,
                    count: Int
                ) {
                }

                override fun afterTextChanged(editable: Editable) {
                    val mS = editable.subSequence(0, editable.length)
                    if (mS.toString() == "" || mS.toString() == null) {
                        return
                    }

                    if (editable.isNotEmpty() && mS.toString().contains("=")) {
                        editable.replace(editable.length - 1, editable.length, "")
                    }
                }
            })

            onFocusChangeListener = OnFocusChangeListener { v, hasFocus ->
                if (hasFocus) showCustomKeyboard(v) else hideCustomKeyboard()
            }

            setOnTouchListener { view, event ->
                val editableText = view as EditText
                val inputType = editableText.inputType

                with(editableText) {
                    setInputType(InputType.TYPE_NULL)
                    onTouchEvent(event)
                    setInputType(inputType)
                }

                true
            }
        }
    }

    private fun hideCustomKeyboard() {
        with(keyboardView) {
            isGone = true
            isEnabled = false
        }
    }

    private fun showCustomKeyboard(view: View?) {
        with(keyboardView) {
            isVisible = true
            isEnabled = true
        }
        view?.let {
            (targetActivity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(
                view.windowToken,
                0
            )
        }
    }
}

Реализация Ниже приведен мой код для моего нижнего листадиалогфрагмента:

    private val keyboardListener by lazy {
        BasicOnKeyboardActionListener(activity ?: requireActivity(), keyboard_view)
    }

    private val customKeyboard by lazy {
        Keyboard(requireContext(), R.xml.keys_layout)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        registerKeyboardEvent()
        setCustomKeyboard()
    }

    private fun setCustomKeyboard() {
        with(keyboard_view) {
            isPreviewEnabled = false
            keyboard = customKeyboard
            setOnKeyboardActionListener(keyboardListener)
        }
    }

    private fun registerKeyboardEvent() {
        with(keyboardListener) {
            registerEditText(et_detailstock_hetnormal)
            registerEditText(et_detailstock_hetpromo)
            registerEditText(et_detailstock_pcs)
            registerEditText(et_detailstock_ctn)
            registerEditText(et_detailstock_tgh)
            registerEditText(et_detailstock_generalpcs)
        }
    }


1 Ответ

0 голосов
/ 17 января 2020

я исправил эту проблему, изменив эту строку private val targetActivity: Activity на private val dialog: Dialog.

, потому что dispatchEvent всегда возвращает false в фрагменте нижнего листа диалога.

ссылка: Android dispatchKeyEvent не вызывается, когда фрагмент диалога показывает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...