gpt4 book ai didi

java - 如何在触摸编辑字段时自动隐藏虚拟键盘?

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:14 25 4
gpt4 key购买 nike

在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);
}
}
}

如果您单击其他字段但未单击任意点,则此编辑字段将隐藏键盘。

最佳答案

我有这个实用程序代码用于显示或隐藏键盘。这对于 OS 4.7 及更高版本应该有效。如果您需要支持较低的操作系统版本,请告诉我。

   /** Hides the virtual keyboard, if there is one showing. */
public static void hideKeyboard() {
VirtualKeyboard kb = UiApplication.getUiApplication().getActiveScreen().getVirtualKeyboard();
if (kb != null) {
kb.setVisibility(VirtualKeyboard.HIDE);
}
}

/** @return TRUE if the virtual keyboard is hidden, or not supported */
public static boolean isKeyboardHidden() {
if (VirtualKeyboard.isSupported()) {
VirtualKeyboard kb = UiApplication.getUiApplication().getActiveScreen().getVirtualKeyboard();
if (kb != null) {
int visibility = kb.getVisibility();
return ((visibility == VirtualKeyboard.HIDE)
|| (visibility == VirtualKeyboard.HIDE_FORCE));
}
}
return true;
}

请注意,我创建了这些静态函数。因此,如果将它们放入名为 UiUtilities 的类中,则可以这样调用它们:

 if (!UiUtilities.isKeyboardHidden()) {
UiUtilities.hideKeyboard();
}

至于在哪里触发此代码,这是我的建议,而不是覆盖onUnfocus()。我不确定这是解决问题的最简单或最有效的方法(所以我欢迎其他答案!),但我认为这会起作用。

我之前告诉过您几个答案,您通常不应该覆盖代码中的touchEvent()方法。对于普通按钮之类的东西,我认为确实如此。这可能是您需要的一个示例。您应该有一个Manager(或VerticalFielManager,或类似的)来表示此EditField 所在的屏幕。在该管理器中,实现 touchEvent() 方法,如下所示:

import net.rim.device.api.ui.TouchEvent;

protected boolean touchEvent(TouchEvent event) {
// We take action when the user completes a click (a.k.a. unclick)
int eventCode = event.getEvent();
if ((eventCode == TouchEvent.UNCLICK) || (eventCode == TouchEvent.DOWN)) {
// Get the touch location, within this Manager
int x = event.getX(1);
int y = event.getY(1);

if ((x >= 0) && (y >= 0) && (x < getWidth()) && (y < getHeight())) {
int field = getFieldAtLocation(x, y);
if (field >= 0) {
// Let event propagate to child field
return super.touchEvent(event);
} else {
if (eventCode == TouchEvent.UNCLICK) {
// A completed click anywhere else in this manager should dismiss the keyboard
UiUtilities.hideKeyboard();
} else {
// This is just a soft touch (TouchEvent.DOWN), without full click
setFocus();
}
// Consume the event
return true;
}
}
}
// Event wasn't for us, let superclass handle in default manner
return super.touchEvent(event);
}

尝试一下。您可能需要更改我的逻辑,具体取决于您是否想要隐藏键盘以进行完整的点击,还是简单的触摸向下(如果您是黑莓手机的新手,可能不清楚它们之间的区别)。但是,我认为这应该会让你接近(r)。

关于java - 如何在触摸编辑字段时自动隐藏虚拟键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11718548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com