Android 按下键盘的“后退”按钮时,继续显示popupWindow

Android 按下键盘的“后退”按钮时,继续显示popupWindow,android,popupwindow,Android,Popupwindow,我正在开发一个Android应用程序,我设计了一个弹出窗口,通过替换活动中的软键盘来显示一些视图。popupWindow包含一个searchView。当我点击一个按钮时,它显示弹出窗口,软键盘被隐藏。现在,当popupWindow中的searchView获得焦点时,我调用该方法: popupWindow.setFocusable(真) 显示键盘,以便用户可以在searchView中开始键入。当searchView处于焦点且软键盘打开时,按back键同时关闭searchView和popupWind

我正在开发一个Android应用程序,我设计了一个弹出窗口,通过替换活动中的软键盘来显示一些视图。popupWindow包含一个searchView。当我点击一个按钮时,它显示弹出窗口,软键盘被隐藏。现在,当popupWindow中的searchView获得焦点时,我调用该方法:

popupWindow.setFocusable(真)

显示键盘,以便用户可以在searchView中开始键入。当searchView处于焦点且软键盘打开时,按back键同时关闭searchView和popupWindow

为了解决这个问题,我创建了一个自定义搜索视图,并覆盖了方法dispatchKeyEventPreIme,如下所示

public class CustomSearchView extends SearchView {

    Context context;
    AppConstant mAppConst;

    public CustomSearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }


    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {

       if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
           clearFocus();
        }
        return super.dispatchKeyEventPreIme(event);
    }
}
当按下后退按钮时,我已从searchView中清除了焦点,但我不知道如何防止弹出窗口关闭


在活动中这样做。如果显示popupWindow,则“后退”按钮将不起任何作用

@Override
public void onBackPressed() {
    if (popupWindow != null && popupWindow.isShowing()) {
        // do nothing
    } else {
        super.onBackPressed();
    }
}
您还可以使用此功能,以便在弹出窗口外单击时,它不会关闭

popupWindow.setOutsideTouchable(false);
///更新

尝试更改此选项:

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
       clearFocus();
       return false;
    } else {
       return super.dispatchKeyEventPreIme(event);
    }
}

这是我尝试过的,它成功了

在onCreate()中:

确保在活动中包含以下内容:

@Override
public void onBackPressed() {
    if (popupWindow != null && popupWindow.isShowing()) {
        Toast.makeText(context, "Activity Back Pressed - PopupWindow showing!", Toast.LENGTH_SHORT).show();
    } else {
        super.onBackPressed();
}
我的XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.package.name.CustomSearchView
        android:layout_width="match_parent"
        android:id="@+id/customSearchView"
        android:background="@android:color/black"
        android:layout_height="match_parent"></com.package.name.CustomSearchView>

</LinearLayout>
执行此实现时,不会调用CustomSearchView的
dispatchKeyEventPreIme
,但会调用活动的
OnBackPressed()


如您所见,当按下后退按钮时,我会放置一个
吐司
,它每次都会调用。试试看。它不会关闭弹出窗口。

我已经用下面的方法完成了<代码>弹出窗口.setBackgroundDrawable(新的BitmapDrawable());popup.setSoftInputMode(WindowManager.LayoutParams.SOFT\u输入状态始终可见);popup.setOutsideTouchable(假)OnBackPressed没有被调用,因此我在dispatchKeyEventPrime中创建了自定义SearchView和检测后退按钮,但我没有任何方法可以停止弹出窗口。如果你知道如何实现它,请提供帮助。这将是一个很大的帮助。非常感谢advanced。好的,但是
活动的
onBackPressed()
呢?这就是当软键盘打开时按下后退按钮时,back key triggersActivity的Backpress不会被调用的原因。请看我的编辑。更改
dispatchKeyEventPreIme
。我犯了一个错误。进行了另一项更改确定,我正在检查此解决方案并将更新您。请尝试此。。popupWindow.setCancelable(false)@MeenalSharma popupWindow没有
setCancelable
方法<代码>警报对话框
对话框
执行。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.package.name.CustomSearchView
        android:layout_width="match_parent"
        android:id="@+id/customSearchView"
        android:background="@android:color/black"
        android:layout_height="match_parent"></com.package.name.CustomSearchView>

</LinearLayout>
public class CustomSearchView extends SearchView {

    Context context;

    public CustomSearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
       if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
           clearFocus();
           Toast.makeText(context, "CustomSearchView Back Pressed", Toast.LENGTH_SHORT).show();
           return false;
       } else {
           return super.dispatchKeyEventPreIme(event);
       }
    }
}