Я создал пользовательскую клавиатуру, и она работает в действии и фрагмент.
Но, к сожалению, это не работает в нижнем диалоговом окне. Когда я нажимаю клавишу, с моим текстом редактирования ничего не происходит.
Вот мой код:
Ключ 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)
}
}