在android中,我可以這樣做,用戶可以在editview之外單擊來隱藏虛擬鍵盤。如何在觸摸編輯區時自動隱藏虛擬鍵盤?
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
boolean ret = super.dispatchTouchEvent(event);
if (v instanceof EditText) {
View w = getCurrentFocus();
int scrcoords[] = new int[2];
w.getLocationOnScreen(scrcoords);
float x = event.getRawX() + w.getLeft() - scrcoords[0];
float y = event.getRawY() + w.getTop() - scrcoords[1];
if (event.getAction() == MotionEvent.ACTION_UP
&& (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
.getBottom())) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
.getWindowToken(), 0);
}
}
return ret;
}
黑莓手機怎麼樣?我只想跑VirtualKeyboard.isSupported()
。
更新
public class Custom_EditField extends EditField {
private int width, row, color;
private MainScreen mainscreen;
Custom_EditField(long style, int width, int row, MainScreen mainscreen) {
super(style);
this.width = width;
this.row = row;
this.mainscreen = mainscreen;
}
public int getPreferredHeight() {
return Font.getDefault().getHeight() * row;
}
public int getPreferredWidth() {
return width;
}
protected void onFocus(int direction) {
if (VirtualKeyboard.isSupported())
mainscreen.getVirtualKeyboard().setVisibility(
VirtualKeyboard.SHOW_FORCE);
invalidate();
super.onFocus(direction);
}
protected void onUnfocus() {
if (VirtualKeyboard.isSupported())
mainscreen.getVirtualKeyboard().setVisibility(
VirtualKeyboard.HIDE_FORCE);
invalidate();
super.onUnfocus();
}
public boolean isFocusable() {
return true;
}
protected void layout(int maxWidth, int maxHeight) {
super.layout(maxWidth,
Math.min(maxHeight, Font.getDefault().getHeight() * row));
super.setExtent(maxWidth,
Math.min(maxHeight, Font.getDefault().getHeight() * row));
}
protected void paint(Graphics graphics) {
int rectHeight = getPreferredHeight();
int rectWidth = getPreferredWidth();
try {
color = Color.BLACK;
graphics.setColor(color);
graphics.drawRect(0, 0, rectWidth, rectHeight);
super.paint(graphics);
} finally {
graphics.setColor(color);
}
}
}
這EditField中會隱藏鍵盤,如果你點擊其它字段,但不anypoint。
所以,我剛剛發佈了一個關於隱藏鍵盤的答案。但是,在再次閱讀您的問題之後,我意識到對您而言,更難的問題可能是檢測到「EditField」外**的觸摸**。你可以發佈一些代碼來顯示你的EditField是如何創建的嗎?它被放入一個'VerticalFieldManager'中?一個自定義的'管理器'子類? – Nate 2012-07-30 09:52:30
當在「EditField」之外進行觸摸時,它將失去焦點。重寫'EditField'的'onUnfocus'方法可能會有所幫助。但是,如果不可調焦的項目被觸及,那麼'EditField'不會失去它的焦點。 – Rupak 2012-07-30 10:07:39
Alan,請參閱我的更新...我認爲它可以覆蓋包含'Custom_EditField'的'Manager'中的'touchEvent()',而不是重寫'unFocus()',這不起作用。 – Nate 2012-07-30 10:36:20