如何在不触摸时使键盘弹出 window 消失

How to make Keyboard's POPUP window dismiss when not touching

我正在创建一个自定义软键盘,并创建了一个 PopupWindow 以在长按某个键时显示,例如当您长按 E 时它会显示 E、É、È 供您选择。弹出窗口有一个关闭他的键,但我想删除这个键并让他在用户触摸时显示,然后用户长按,拖动到他想要的键并释放。

我正在使用 android API 8.

弹出窗口是在 KeyboardView class 的 onLongPress 方法中创建的。

final View custom = LayoutInflater.from(context)
     .inflate(R.layout.popup_layout, new FrameLayout(context));
final PopupWindow popup = new PopupWindow(context);

popup.setContentView(custom);

        popup.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
        popup.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
        popup.showAtLocation(this, Gravity.NO_GRAVITY, popupKey.x, popupKey.y-50);

关闭弹窗的按钮:

        buttonCancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                popup.dismiss();
            }
        });

我觉得可以用onTouch方法的东西,但是怎么判断release事件呢?在哪里使用它?在键盘视图上,或者可能在弹出窗口上 window?

我设法做到了:

@Override
public boolean onTouchEvent(MotionEvent me){
    if(popup != null && me.getAction() == MotionEvent.ACTION_UP){
        popup.dismiss();
    }
}

我首先创建了一个方法来在 logcat 上显示每个触摸事件的代码,然后我得到了当我释放触摸时出现的代码并与文档进行比较,它是 MotionEvent.ADCTION_UP。 有了这个,它只是关闭了弹出窗口。

我看到有一个私有函数叫KeyboardView.dismissPopupKeyboard()。

这很丑陋,但是因为我使用的是默认的 PopupWindow(我没有重写 OnLongPress())而且我看到 KeyboardView.onClick() 调用 dismissPopupKeyboard() 就是这样,我所做的是:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        if (event.getAction() == MotionEvent.ACTION_UP){
            getOnKeyboardActionListener().onKey('1', null);
            dismissPopupKeyboard();
        }
        return true; // Required for recieving subsequent events (ACTION_MOVE, ACTION_UP)
    }