我正在尝试实现一个自定义的键盘布局(使用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
}
}
非常感谢你们!
答案 0 :(得分:0)
你真的想做什么?如果你想制作一个全球性的键盘,那你就错了。您需要从InputMethodService派生并以这种方式使用所有功能。你做事的方式实际上对许多东西都不起作用 - 你实际上并没有写软键盘,而是在模仿一个物理键盘。普通软键盘不使用onKey调用,只使用物理按键,所以各种各样的东西都不会这样。此外,您还缺少自动更正等大量功能。
如果您正在尝试为自己的应用制作键盘 - 您的用户会讨厌它,而且这种方式永远不会正常工作。您也失去了所有非英语用户,因为他们无法使用特定语言的键盘。但是,当您将视图可见性设置为.GONE时,您处于正确的轨道上 - 您还必须覆盖每个编辑文本的onClick处理程序,并让它将可见性设置回VISIBLE