keyboardview键码不工作

时间:2013-10-07 20:58:42

标签: java android

我刚开始使用Android编程,想要创建一个没有特殊噱头的简单Hangman游戏。 我的应用程序的布局如下所示:http://www.imagebanana.com/view/2cqs6lt3/Unbenannt.PNG 因此主要活动包含一个ImageView,也显示游戏的当前状态,一个TextView用于显示要猜测的单词,另一个用于输入的KeyboardView。

对于这个键盘我用这个keyboard_layout.xml文件创建了一个自定义键盘:

<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.Keyboard xmlns:android="http://schemas.android.com/apk/res/android" >

<Row
    android:horizontalGap="1%p"
    android:keyHeight="8%p"
    android:verticalGap="0.7%p" >
    <Key
        android:codes="65"
        android:keyLabel="A" android:keyEdgeFlags="left"/>
    <Key
        android:codes="66"
        android:keyLabel="B" />
    <Key
        android:codes="67"
        android:keyLabel="C" />
    <Key
        android:codes="68"
        android:keyLabel="D" />
    <Key
        android:codes="69"
        android:keyLabel="E" />
    <Key
        android:codes="70"
        android:keyLabel="F" />
    <Key
        android:codes="71"
        android:keyLabel="G" />
    <Key
        android:codes="72"
        android:keyLabel="H" />
    <Key
        android:codes="73"
        android:keyLabel="I" android:keyEdgeFlags="right"/>
</Row>
<Row
    android:horizontalGap="1%p"
    android:keyHeight="8%p"
    android:verticalGap="0.7%p" >
    <Key
        android:codes="74"
        android:keyLabel="J" android:keyEdgeFlags="left"/>
    <Key
        android:codes="75"
        android:keyLabel="K" />
    <Key
        android:codes="76"
        android:keyLabel="L" />
    <Key
        android:codes="77"
        android:keyLabel="M" />
    <Key
        android:codes="78"
        android:keyLabel="N" />
    <Key
        android:codes="79"
        android:keyLabel="O" />
    <Key
        android:codes="80"
        android:keyLabel="P" />
    <Key
        android:codes="81"
        android:keyLabel="Q" />
    <Key
        android:codes="82"
        android:keyLabel="R" android:keyEdgeFlags="right"/>
</Row>
<Row
    android:horizontalGap="1%p"
    android:keyHeight="8%p"
    android:verticalGap="0.7%p" >
    <Key
        android:codes="83"
        android:horizontalGap="2.5%p"
        android:keyLabel="S" android:keyEdgeFlags="left"/>
    <Key
        android:codes="84"
        android:keyLabel="T" />
    <Key
        android:codes="85"
        android:keyLabel="U" />
    <Key
        android:codes="86"
        android:keyLabel="V" />
    <Key
        android:codes="87"
        android:keyLabel="W" />
    <Key
        android:codes="88"
        android:keyLabel="X" />
    <Key
        android:codes="89"
        android:keyLabel="Y" />
    <Key
        android:codes="90"
        android:keyLabel="Z" android:keyEdgeFlags="right"/>
</Row>

keyboard_layout</android.inputmethodservice.Keyboard>

并将其传递给keyboardView:

public class MainActivity extends Activity {
...

private void setKeyboardView() {
    Keyboard keys = new Keyboard(this, R.xml.keyboard_layout);
    KeyboardView kv = (KeyboardView) findViewById(R.id.keyboard_view);
    kv.setKeyboard(keys);

    kv.setEnabled(true);
    kv.setClickable(true);

    OnKeyboardActionListener listener = new OnKeyboardActionListener() {

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

        @Override
        public void onPress(int primaryCode) {
            TextView tv = (TextView) findViewById(R.id.text_view);
            tv.setText("" + primaryCode);
        }

        @Override
        public void onRelease(int primaryCode) {
        }

        @Override
        public void onText(CharSequence text) {
            // TODO Auto-generated method stub

        }

        @Override
        public void swipeDown() {
            // TODO Auto-generated method stub

        }

        @Override
        public void swipeLeft() {
            // TODO Auto-generated method stub

        }

        @Override
        public void swipeRight() {
            // TODO Auto-generated method stub

        }

        @Override
        public void swipeUp() {
            // TODO Auto-generated method stub

        }

    };
    kv.setOnKeyboardActionListener(listener);
}

正如您所看到的,我还添加了一个“OnKeyboardActionListener”,它只是将按下的按钮的keyCode传递给textView。

但是当我按下一个按钮时,无论我按什么按钮,听众都会给出一个空引用。 (当我没有将“primaryCode”转换为字符串时,应用程序崩溃。)除了只有“OnKeyboardActionListener”的“onPress”方法有效时,我将onPress方法中的代码放入onKey或onRelease方法什么都没发生。

这是我的MainActivity的布局xml:

<LinearLayout 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:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<ImageView android:id="@+id/image_view"
    android:contentDescription="@string/imgView"
    android:layout_weight="3"
    android:layout_height="0dp"
    android:layout_width="match_parent"
    android:background="@android:color/background_dark"
    />

<TextView android:id="@+id/text_view"
    android:layout_weight="1"
    android:layout_height="0dp"
    android:layout_width="fill_parent"
    android:textSize="25sp"
    android:gravity="center"
    android:hint="@string/textview_hint"
    android:background="@android:color/background_dark"
    />

<android.inputmethodservice.KeyboardView android:id="@+id/keyboard_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />

</LinearLayout>

所以我用Google搜索并尝试了不同的设置,但没有任何帮助:( 你们中有谁可以帮我解决这个问题吗? 一般来说,将keyBoardView永久显示在我的程序中这样做是不是一个好主意?

问候 rakumbo

1 个答案:

答案 0 :(得分:0)

尝试:

StringBuilder mComposing = new StringBuilder();

String value =   mComposing.append((char) primaryCode);

在此处更改

 @Override 
        public void onPress(int primaryCode) {
            TextView tv = (TextView) findViewById(R.id.text_view);
            tv.setText("" + value);
        } 

<强>布局/ input.xml中

   <android.inputmethodservice.KeyboardView android:id="@+id/keyboard_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />

<强>键盘

 Keyboard keys = new Keyboard(this, R.xml.keyboard_layout);
    KeyboardView mInputView = (KeyboardView) getLayoutInflater().inflate(
                    R.layout.input, null);
            mInputView.setOnKeyboardActionListener(this);
            mInputView.setKeyboard(keys);