我正在开发一个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中清除了焦点,但我不知道如何防止弹出窗口关闭。
在你的活动中这样做。如果显示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()中:
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