为备用键创建自定义弹出键盘

Posted

技术标签:

【中文标题】为备用键创建自定义弹出键盘【英文标题】:Creating custom popup keyboard for alternative keys 【发布时间】:2018-02-26 13:42:57 【问题描述】:

我正在尝试为 android 中的替代键创建自定义弹出键盘。通过使用默认键盘,我唯一能做的就是为弹出键盘提供自定义布局。

我还需要自定义行为(就像 Gboard 中的那个)例如,

(1) 当一个按钮被长按时,默认情况下它应该高亮一个特定的键

(2) 按键可以高亮显示,也可以通过移动手指来选择(长按按键同时移动手指)

这些是我引用的链接:

Building a custom android keyboard

Creating a SoftKeyboard with Multiple/Alternate characters per key

How do you disable the SoftKeyboard key preview window?

这是 Gboard 中的弹出式键盘

任何建议/帮助将不胜感激。

谢谢。

【问题讨论】:

你找到解决办法了吗? @MateenChaudhry no 您是否在键盘中实现了建议? 实际上没有。还没有找到更好的解决方案。 【参考方案1】:

如我所见,您已经查看了这篇文章:https://www.blackcj.com/blog/2016/03/30/building-a-custom-android-keyboard

它解释了如何为弹出键盘添加自定义布局。 它允许的唯一自定义是更改键背景和文本颜色。

此外,您可以使用 KeyboardView 子类,然后覆盖其方法以实现您的目标,例如 onTouchEvent() 捕获运动事件或 onDraw() 重绘键盘区域:

<org.home.CustomPopupKeyboard
  android:id="@android:id/keyboardView"
  ...
/>

另外,请查看 Hacker's Keyboard 来源:https://github.com/klausw/hackerskeyboard

似乎,它在layout/keyboard_popup.xml 中使用LatinKeyboardBaseView extends View 类作为弹出式键盘。


编辑:

根据 Hacker's Keyboard 代码,我发现释放键时关闭弹出窗口的唯一方法是创建自己的 KeyboardView 类,该类直接扩展 View,然后更改其onTouchEvent()

Android 的原生 KeyboardView 类具有 PopupWindow mPopupKeyboard 属性,即 private,因此您不能对其进行子类化并调用 mPopupKeyboard.dismiss() 来隐藏弹出窗口。

从释放键到弹出关闭的链是:

LatinKeyboardBaseView::onTouchEvent() > case MotionEvent.ACTION_UP: onUpEvent() > tracker.onUpEvent() PointerTracker::onUpEvent() > detectAndSendKey() > listener.onCancel() LatinKeyboardBaseView::onCancel()(实现OnKeyboardActionListener接口)>dismissPopupKeyboard()>mMiniKeyboardPopup.dismiss()

【讨论】:

【参考方案2】:
    <?xml version="1.0" encoding="utf-8"?>


    <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
        android:keyWidth="10%p"
        android:horizontalGap="0px"
        android:verticalGap="0px"
        android:keyHeight="@dimen/key_height">
        <Row android:keyHeight="2px"></Row>
        <Row>
            <Key
                android:codes="49"
                android:keyEdgeFlags="left"
                android:keyLabel="1" />
            <Key
                android:codes="50"
                android:keyLabel="2" />
            <Key
                android:codes="51"
                android:keyLabel="3" />
            <Key
                android:codes="52"
                android:keyLabel="4" />
            <Key
                android:codes="53"
                android:keyLabel="5" />
            <Key
                android:codes="54"
                android:keyLabel="6" />
            <Key
                android:codes="55"
                android:keyLabel="7" />
            <Key
                android:codes="56"
                android:keyLabel="8" />
            <Key
                android:codes="57"
                android:keyLabel="9" />
            <Key
                android:codes="48"
                android:keyEdgeFlags="right"
                android:keyLabel="0" />
        </Row>

        <Row>
            <Key
                android:codes="113"
                android:keyEdgeFlags="left"
                android:keyLabel="q" />
            <Key
                android:codes="119"
                android:keyLabel="w" />

            <Key
                android:codes="101"
                android:keyLabel="e" />
            <Key
                android:codes="114"
                android:keyLabel="r" />
            <Key
                android:codes="116"
                android:keyLabel="t" />
            <Key
                android:codes="121"
                android:keyLabel="y" />
            <Key
                android:codes="117"
                android:keyLabel="u" />
            <Key
                android:codes="105"
                android:keyLabel="i" />

            <Key
                android:codes="111"
                android:keyLabel="o" />
            <Key
                android:codes="112"
                android:keyEdgeFlags="right"
                android:keyLabel="p" />
        </Row>


        <Row>

            <Key
                android:codes="97" android:keyLabel="a" android:horizontalGap="5%p"
                android:keyEdgeFlags="left" android:popupKeyboard="@xml/keyboard_popup_template"
                android:popupCharacters="áăä"/>
            <Key
                android:codes="115"
                android:keyLabel="s" />
            <Key
                android:codes="100"
                android:keyLabel="d" />
            <Key
                android:codes="102"
                android:keyLabel="f" />
            <Key
                android:codes="103"
                android:keyLabel="g" />
            <Key
                android:codes="104"
                android:keyLabel="h" />
            <Key
                android:codes="106"
                android:keyLabel="j" />
            <Key
                android:codes="107"
                android:keyLabel="k" />
            <Key
                android:codes="108"
                android:keyEdgeFlags="right"
                android:keyLabel="l" />


        </Row>

        <Row>
            <Key
                android:codes="-1" android:keyIcon="@drawable/narrow2"
                android:keyWidth="15%p" android:isModifier="true"
                android:isSticky="true" android:keyEdgeFlags="left" />
            <Key
                android:codes="122"
                android:keyLabel="z"
                android:keyWidth="15%p" />
            <Key
                android:codes="120"
                android:keyLabel="x"
                android:keyWidth="15%p" />
            <Key
                android:codes="99"
                android:keyLabel="c"
                android:keyWidth="15%p" />
            <Key
                android:codes="118"
                android:keyLabel="v"
                android:keyWidth="15%p" />
            <Key
                android:codes="98"
                android:keyLabel="b"
                android:keyWidth="15%p" />
            <Key
                android:codes="110"
                android:keyLabel="n"
                android:keyWidth="15%p" />
            <Key
                android:codes="109"
                android:keyLabel="m"
                android:keyWidth="15%p" />
            <Key
                android:codes="-5"
                android:isRepeatable="true"
                android:keyEdgeFlags="right"
                android:keyIcon="@drawable/sym_keyboard_delete"
                android:keyWidth="20%p" />
        </Row>

        <Row
            android:rowEdgeFlags="bottom"
            android:verticalGap="5px">

            <Key
                android:codes="-2"
                android:keyEdgeFlags="left"
                android:keyLabel="123"
                android:keyWidth="15%p" />
            <Key
                android:codes="64"
                android:keyLabel="\@"
                android:keyWidth="10%p" />

            <Key
                android:codes="-101"
                android:keyIcon="@drawable/sym_keyboard_language_switch"
                android:keyWidth="10%p" />
            <Key
                android:codes="32"
                android:isRepeatable="true"
                android:keyLabel="SPACE"
                android:keyWidth="30%p" />

            <Key
                android:codes="46"
                android:keyLabel="."
                android:keyWidth="10%p" />
            <Key
                android:codes="44"
                android:keyLabel=","
                android:keyWidth="10%p"
                android:popupCharacters=".,?!#@"
                android:popupKeyboard="@xml/keyboard_popup_template" />
            <Key
                android:codes="-4"
                android:keyEdgeFlags="right"
                android:keyLabel="DONE"
                android:keyWidth="20%p" />
        </Row>

        <Row android:keyHeight="2px"></Row>

    </Keyboard>

Please try it.

【讨论】:

这不是他关于自定义弹出窗口的问题的答案

以上是关于为备用键创建自定义弹出键盘的主要内容,如果未能解决你的问题,请参考以下文章

键盘 Swift 上的自定义键

Xamarin | Android |自定义键盘Android.Views.KeyCode

在自定义视图上显示弹出菜单时不要关闭键盘

长按Android自定义键盘弹出键盘

在运行时将行和键添加到android中的自定义键盘

如何根据文本输入类型在自定义键盘中标记返回键