我遵循了有关developer.android.com的Input 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?
最佳答案
实现备用键弹出窗口:
对于您希望具有弹出式键盘的每个键,应定义popupCharacters和popupKeyboard:/res/xml/[Keyboard].xml
<Key android:keyLabel="("
android:popupKeyboard="@xml/keyboard_popup_template"
android:popupCharacters="[{<" />
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>
产生此结果:
在设法以与系统键盘相同的方式实现此功能之前,我不会感到高兴!