从XML生成自定义软键盘:后退按钮不起作用

时间:2014-06-15 15:58:22

标签: android android-softkeyboard

我正在尝试实现一个自定义的键盘布局(使用XML)并在经过多次努力后才能使用它。 问题是,当我完成打字时,我想要一个“后退”按钮(或其他)来关闭键盘。我调查了一下,发现我可以使用这个http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK

在我的键盘xml布局中有以下内容:

<Key android:codes="4" android:keyLabel="BACK" android:keyEdgeFlags="right" />

不幸的是,当按下标有“BACK”的键时,没有任何具体的事情发生。我只能在BasicOnKeyboardActionListener中看到正在传播的代码正确。 我甚至试图让onKey()方法在包含自定义键盘的视图上调用Visibility.Gone(或INVISIBLE),这会隐藏键盘,但如果我点击EditText,则键盘不会再显示。

有关如何处理此问题的任何提示?

(顺便说一下,我决定制作自己的键盘,因为我需要改变按钮的颜色,显然没有其他方法可以做到这一点 - 我错了吗?)

这是我的MainActivity代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }

    mKeyboard = new Keyboard(this, R.xml.ckeyboard);
    mTargetView = (EditText) findViewById(R.id.target);
    mTargetView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                    basicKeyboardView.setVisibility(View.VISIBLE);
                    return true;
            }
    });

    basicKeyboardView = (KeyboardView) findViewById(R.id.keyboard_view);
    basicKeyboardView.setKeyboard(mKeyboard);
    basicKeyboardView.setOnKeyboardActionListener(new BasicOnKeyboardActionListener(this));
}

ckeyboard.xml:

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

    <Row>
            <Key android:codes="8" android:keyLabel="1" android:keyEdgeFlags="left" />
            <Key android:codes="9" android:keyLabel="2" />
            <Key android:codes="10" android:keyLabel="3" android:keyEdgeFlags="right" />
    </Row>

    <Row>
            <Key android:codes="11" android:keyLabel="4" android:keyEdgeFlags="left" />
            <Key android:codes="12" android:keyLabel="5" />
            <Key android:codes="13" android:keyLabel="6" android:keyEdgeFlags="right" />
    </Row>

    <Row>
            <Key android:codes="14" android:keyLabel="7" android:keyEdgeFlags="left" />
            <Key android:codes="15" android:keyLabel="8" />
            <Key android:codes="16" android:keyLabel="9" android:keyEdgeFlags="right" />
    </Row>

    <Row>
            <Key android:codes="67" android:keyLabel="DEL"
                    android:keyEdgeFlags="left" />

            <Key android:codes="7" android:keyLabel="0" />

            <Key android:codes="6" android:keyLabel="BACK" android:keyEdgeFlags="right" />
    </Row>        
</Keyboard>

BasicOnKeyboardActionListener.java:

package com.example.keyboardtest;

import android.app.Activity;
import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
import android.util.Log;
import android.view.KeyEvent;

public class BasicOnKeyboardActionListener implements OnKeyboardActionListener {

    private Activity mTargetActivity;

    public BasicOnKeyboardActionListener(Activity targetActivity) {
            mTargetActivity = targetActivity;
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
            long eventTime = System.currentTimeMillis();
            KeyEvent event = new KeyEvent(
                            eventTime, 
                            eventTime,
                            KeyEvent.ACTION_DOWN, primaryCode, 0, 0, 0, 0,
                            KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE);

            Log.d("KTAG", new Integer(primaryCode).toString());
            mTargetActivity.dispatchKeyEvent(event);

    }

    @Override
    public void onPress(int arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onRelease(int arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onText(CharSequence arg0) {
        // 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

    }
}

非常感谢你们!

1 个答案:

答案 0 :(得分:0)

你真的想做什么?如果你想制作一个全球性的键盘,那你就错了。您需要从InputMethodService派生并以这种方式使用所有功能。你做事的方式实际上对许多东西都不起作用 - 你实际上并没有写软键盘,而是在模仿一个物理键盘。普通软键盘不使用onKey调用,只使用物理按键,所以各种各样的东西都不会这样。此外,您还缺少自动更正等大量功能。

如果您正在尝试为自己的应用制作键盘 - 您的用户会讨厌它,而且这种方式永远不会正常工作。您也失去了所有非英语用户,因为他们无法使用特定语言的键盘。但是,当您将视图可见性设置为.GONE时,您处于正确的轨道上 - 您还必须覆盖每个编辑文本的onClick处理程序,并让它将可见性设置回VISIBLE