如何在不触摸时关闭键盘的POPUP窗口

时间:2016-01-20 19:38:38

标签: android android-softkeyboard popupwindow ontouchlistener ontouchevent

我正在创建一个自定义软键盘,并创建一个PopupWindow来显示何时长按一个键,就像你长按E并显示E,É,È供你选择一个。弹出窗口有一个关闭他的键,但我想删除这个键并在用户触摸时让他显示,然后用户长按,拖动到他想要的键并释放。

我正在使用android API 8.

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

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方法,但如何识别释放事件?在哪里使用它?在keyboardView上,或者在弹出窗口中?

2 个答案:

答案 0 :(得分:0)

我设法用:

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

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

答案 1 :(得分:0)

我看到有一个名为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)
    }