我遵循了有关developer.android.comInput Methods上的示例,并使用了SoftKeyboard示例应用程序。这些共同提供了有关创建简单键盘的足够信息。

我在API中看不到的功能是每个键都可以创建替代字符/多个字符,这是标准键盘(LatinIME键盘)上可用的功能。

上图是长按“a”键的结果。长按一个键时,可以用其他字符填充弹出窗口。

也可以在某些按键上给出弹出提示,提示用户按下并按住某个按键以获取弹出菜单。

到目前为止,我还没有找到有关如何实现此目标的单一信息源,希望有人能够为我提供一个很好的开端,直到那时我将遵循内置键盘的源代码,看看是否可以进行反向工程它。

编辑:如果developer.android.com到LatinIME键盘的链接未链接到Sheep的图片,将有帮助:) LatinIME.java的实际源代码。

编辑2:作为引用,比什么都重要,我相信这是通常的longPress操作所经历的序列,以便在KeyboardView.java中显示弹出键盘:

onTouchEvent()
onModifiedTouchEvent()
mHandkler.handleMessage() with MSG_LONGPRESS
openPopupIfRequired()
onLongPress()

编辑3:

我仍然没有弄清楚-您如何向键添加标签建议?一个答案表明它不是API内置的,实际上我还没有找到执行此操作的代码。但是,在2.3.4(API 10)上的键盘显示了正在实现的此功能:

非常想弄清楚它是如何实现的,但是在onDraw()方法中我看不到它的任何地方-这使我相信它是在KeyboardView元素之外编写的。但是,我找不到用于在内置键盘上显示KeyboardView元素的layout文件-如果有人知道在哪里可以找到它,也许这会给我我所需的线索。

编辑4:已将键预览问题移至此处,因为它与主题略有偏离:

How do you disable the SoftKeyboard key preview window?

最佳答案

实现备用键弹出窗口:

对于您希望具有弹出式键盘的每个键,应定义popupCharacterspopupKeyboard:
/res/xml/[Keyboard].xml

<Key android:keyLabel="("
    android:popupKeyboard="@xml/keyboard_popup_template"
    android:popupCharacters="[{&lt;" />
popupKeyboard是弹出菜单中使用的键盘的XML表示,其中包含备用键:
/res/xml/keyboard_popup_template.xml
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="56dp">
</Keyboard>

设置备用键弹出窗口的样式:

如果要更改弹出窗口的布局/样式(默认为@android:layout/ keyboard_popup_keyboard.xml),可以指定一个指向布局文件的android:popupLayout属性:
<android.inputmethodservice.KeyboardView
    android:id="@+id/keyboard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="#FF272727"
    android:popupLayout="@layout/keyboard_popup_keyboard" />

实现密钥预览覆盖:

下面是我能够共同显示按键预览的唯一解决方案(无需完全重写KeyboardView源代码):

<KeyboardView>包裹<FrameLayout>标签,该标签的高度是通过将keyHeight乘以行数来指定的高度。在此标记内,我只是简单地创建了一个LinearLayout来容纳行,然后为包含TextView的每一行使用LinearLayout,其权重等于为每个<Key>指定的%p值:
<TextView android:text="!" style="@style/Custom.Widget.KeyboardKeyOverlay"  android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="10"/>

并设置为:
<style name="CustomTheme.Widget.KeyboardKeyOverlay">
    <item name="android:background">@android:color/transparent</item>
    <item name="android:textColor">#FFAAAAAA</item>
    <item name="android:paddingRight">6dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:textSize">10sp</item>
    <item name="android:gravity">right</item>
    <item name="android:textStyle">bold</item>
</style>

产生此结果:

在设法以与系统键盘相同的方式实现此功能之前,我不会感到高兴!

08-18 05:38
查看更多