自定义KeyboardView上的keyOutputText属性不输出任何文本

时间:2016-02-07 00:07:48

标签: java android xml android-studio

我尝试制作自定义键盘,但它没有输出我在keyOutputText节点上Key设置的文本值。

此处activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

这是键盘布局:

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:horizontalGap="0px"
    android:keyHeight="60dp"
    android:keyWidth="15%p"
    android:verticalGap="0px">

    <Row>
        <Key
            android:keyLabel="test"
            android:keyOutputText="test" />
    </Row>
</Keyboard>

这是Java类:

import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.view.View;
import android.view.inputmethod.InputConnection;

public class TestKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener {

    private KeyboardView kv;
    private Keyboard keyboard;

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

    @Override
    public void onPress(int primaryCode) {
    }

    @Override
    public void onRelease(int primaryCode) {
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
    }

    @Override
    public void onText(CharSequence text) {

    }

    @Override
    public void swipeLeft() {

    }

    @Override
    public void swipeRight() {

    }

    @Override
    public void swipeDown() {

    }

    @Override
    public void swipeUp() {

    }
}

我还没有找到任何有关这方面的精彩教程,所以我不确定我是否还没有实现我应该使用的任何代码?如有必要,我会提供更多代码和资源。一切正常,应用程序构建和启动,我可以将我当前的键盘设置为这一个,但实际按下键时没有任何反应。它响应就好像我按下它但没有输出文字。

2 个答案:

答案 0 :(得分:1)

事实证明,我只需实施onText方法。

@Override
public void onText(CharSequence text) {
    getCurrentInputConnection().commitText(text, 1);
}

答案 1 :(得分:0)

当您按下某个键时,将调用onKey(int primaryCode, int[] keyCodes)方法,并且您方法的正文为空,所以没有任何反应!

primaryCode参数实际上是您在键盘xml文件中定义的按下的android:codes的{​​{1}}属性,而不是Key!使用正确的ASCII代码填充android:keyOutputText属性。

为了提交文本,您可以使用这样的简单代码块:

android:codes

IME是一个非常广泛的话题,您可以在互联网上找到很多相关内容,请查看tutorials,这对我帮助很大。

顺便提一下,您可以找到一些源代码here

祝你好运!