当前位置: 首页 > 知识库问答 >
问题:

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

庄瀚玥
2023-03-14

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

PopupWindow.set聚焦(真)

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

为了解决这个问题,我创建了一个自定义的search chView,并覆盖了下面所示的方法调度KeyEventPreIme。

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中清除了焦点,但我不知道如何防止弹出窗口关闭。

共有2个答案

尹何平
2023-03-14

在你的活动中这样做。如果显示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);
    }
}
单于耘豪
2023-03-14

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

在onCreate()中:

private PopupWindow popupWindow;

someButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View popupView = inflater.inflate(R.layout.popupwindow_view, null, false);

        popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        popupWindow.setOutsideTouchable(false);

        CustomSearchView searchView = (CustomSearchView) popupView.findViewById(R.id.customSearchView);
        popupWindow.showAsDropDown(someButton, 50, -30);
    }
});

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

@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>

iew.java

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

当我执行此实现时,CustomSearchView的调度KeyEventPreIme不被调用,但是活动的OnBackPmed()被调用。

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

 类似资料:
  • 在我的应用程序中,我有一个EditText。当我聚焦这个元素时,会出现光标和键盘。当我知道按下后退按钮时,键盘消失,但元素保持聚焦,闪烁的光标仍然可见。 我试图用我在其他帖子上找到的代码来管理它,但它不起作用,我只是不明白这个事件。

  • XML 活动 创建 已选择选项项 在getActionBar()行上获取空指针异常。setDisplayHomeAsUpEnabled(真);

  • 我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。 实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。 我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。 下面是我的资产代码如何工作的简化版本。 在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有

  • 问题内容: 我想按一下软键盘上的任何键。我不想在Activity中使用EditView或TextView,必须从Activity内部的扩展View处理该事件。 我只是试过这个: 1)覆盖活动方法。该功能不适用于软键盘,只能捕获很少的硬键盘。 2)创建我的并在我的视图中注册该视图,其中包含已注册并正在运行的。这对于软键盘根本不起作用。 3)覆盖View方法。如果我设置我的OnKeyListener或

  • 我正在使用android导航组件库。我用导航图设置了两个片段。我想在我的片段内按下后退按钮时做一些额外的动作。 我使用这段代码来处理工具栏上的按钮点击,但我也想处理后退按钮按下。我该怎么做?

  • 我有三个类实现了LibGdx屏幕类: 主菜单屏幕,关卡选择屏幕,游戏屏幕 现在我有Main MenuScreen的setCatchBackKey设置为false,所以游戏将只退出后按。 LevelSelectScreen和GameScreen已将setCatchBackKey设置为true。 在GameScreen的渲染功能中,我有: 它将屏幕设置为显示level select,并且在LevelS