【问题标题】:Creating custom keyboard for android为android创建自定义键盘
【发布时间】:2016-12-10 14:54:57
【问题描述】:

好吧,您可能已经见过很少有人问这个问题了。 但是阅读所有这些问题/答案以及 Google 中几乎所有的 android inputmethod 网页,我仍然遇到了麻烦。

我的最终目标是创建一个自定义键盘。当然,我的某些语言会有特殊的输入法。

但这一次,我只想在弹出键盘时显示我的自定义视图。我已经设法根据 qwerty.xml 文件弹出默认布局,类似于这样。

xml/qwerty.xml

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="60dp"
>
<Row android:rowEdgeFlags="bottom">
    <Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>
    <Key android:codes="44" android:keyLabel="," android:keyWidth="7%p"  />
    <Key android:codes="47" android:keyLabel="/" android:keyWidth="7%p" />
    <Key android:codes="32" android:keyLabel="SPACE" android:keyWidth="30%p" android:isRepeatable="true"/>
    <Key android:codes="-5" android:keyLabel="DEL" android:keyWidth="18%p" android:isRepeatable="true"/>
    <Key android:codes="-4" android:keyLabel="DONE" android:keyWidth="18%p" android:keyEdgeFlags="right"/>
</Row>

在我扩展 InputMethodService 的类中,我有这段代码可以创建输入视图。

private KeyboardView myKeyView;
private Keyboard keyboard;

@Override
public View onCreateInputView() {
    myKeyView = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
    keyboard = new Keyboard(this, R.xml.qwerty);
    myKeyView.setKeyboard(keyboard);
    myKeyView.setOnKeyboardActionListener(this);
    return myKeyView;
}

当然,因为我在将自定义视图应用于源代码时遇到了问题。 我只是在另一边做了一些努力。当按下xml中的设置键时,

<Key android:codes="999" android:keyLabel="Settings" android:keyWidth="20%" android:keyEdgeFlags="left"/>

它会调用 SettingsActivity

@Override
public void onKey(int primaryCode, int[] keyCodes) {
    if(primaryCode == 999) {
        openSettings();
    }
}

public void openSettings()
{
    Intent intent = new Intent(this, WRKeySettings.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

到这里为止它工作得很好,但我遇到了这个视图问题。

通过阅读 android 开发人员和一些文章,我的想法是,我可以扩展 KeyboardView 以制作我的自定义视图,并且在这种方法中,我可以使用 onDraw() 以某种方式绘制键。但是我在这样做时遇到了很多麻烦。

任何建议都会很高兴。谢谢。

【问题讨论】:

  • 只是为了清楚地理解问题,您想以编程方式创建另一个布局吗?您想对现有的进行更改吗?您想在不同的应用程序上重复使用相同的“键盘”吗?您可以“重绘”键,但它们将具有相同的功能,或者您可以在布局中添加视图,并“重做”窗口......尽量具体说明您希望完成的工作

标签: android keyboard android-custom-view android-softkeyboard android-input-method


【解决方案1】:

要自定义键盘,您需要修改 xml 文件夹中的“qwerty”和布局文件夹中的键盘。我将展示一些示例:

这在布局文件夹中

<?xml version="1.0" encoding="UTF-8"?>
<com.example.keyboard.MyKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:keyPreviewLayout="@layout/preview"
android:keyBackground="@drawable/key_selector"
android:shadowRadius="0.0"
android:keyTextColor="#000000"
/> 

这在 xml 文件夹中:

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:keyHeight="8%p">

<Row android:verticalGap="1%p"  android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
    <Key android:codes="113"    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:keyLabel="p" />
</Row>
<Row android:verticalGap="1%p" android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
    <Key android:codes="97"    android:keyLabel="a" android:keyEdgeFlags="left" android:horizontalGap="5%p" />
    <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:keyLabel="l" />
</Row>
<Row android:verticalGap="1%p"  android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
    <Key android:codes="3"      android:keyIcon="@drawable/keyboard_shift_off_normal" 
         android:keyWidth="13.7%p"/>
    <Key android:codes="122"    android:keyLabel="z" android:horizontalGap="1%p"/>
    <Key android:codes="120"    android:keyLabel="x" />
    <Key android:codes="99"     android:keyLabel="c" />
    <Key android:codes="118"    android:keyLabel="v" />
    <Key android:codes="98"     android:keyLabel="b" />
    <Key android:codes="110"    android:keyLabel="n" />
    <Key android:codes="109"    android:keyLabel="m" />
    <Key android:codes="-5"     android:keyIcon="@drawable/sym_keyboard_delete_dim"
         android:keyWidth="13.7%p" 
        android:horizontalGap="1%p"/>
</Row>
<Row android:verticalGap="1%p"  android:horizontalGap="0.5%p" android:keyWidth="9.6%p">
    <Key android:codes="-16"    android:keyIcon="@drawable/keyboard_symbol"
         android:keyWidth="18.7%p"/>
    <Key android:codes="44"     android:keyLabel="," android:horizontalGap="1%p"/>
    <Key android:codes="32"     android:keyIcon="@drawable/sym_keyboard_feedback_space" android:keyWidth="40%p"/>
    <Key android:codes="46"     android:keyLabel="."/>
    <Key android:codes="-3"     android:keyIcon="@drawable/keyboard_go" 
         android:keyWidth="18.5%p" android:horizontalGap="1%p"/>
</Row>
</Keyboard>

就像你说的,你可以从键盘布局扩展一个类,但它更多是用于自定义键盘事件,如 onTouch、onLongKeyPress、

【讨论】:

  • 不幸的是,这不是我想要的具体答案。我只是想办法让这件事发挥作用,并为此写一份具体的指南,因为目前还没有这方面的内容。
猜你喜欢
  • 2016-05-29
  • 2012-12-26
  • 2016-04-25
  • 2012-01-09
  • 2011-07-02
  • 2011-09-27
  • 2018-02-26
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多