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

在webview中检测键盘何时处于活动状态

谷梁凌
2023-03-14

我还没有找到任何方法来解决这个问题。

我的应用程序中有一个网络视图。我希望能够检测键盘何时处于活动状态,何时处于非活动状态。当这些变化发生在网络视图中时,它似乎无法检测到。

我想对这些不同的状态执行操作。在iOS上,当键盘处于活动状态时,通过观察者进行监听非常简单。Ref UIKeyboard将显示/隐藏。

Android中是否有任何功能与这些观察者在Android中的功能相同?

希望这个问题解释得足够好。

共有1个答案

雍嘉勋
2023-03-14

所以我挣扎了一周左右,发现这里有很多材料是我的解决方案,我真的希望它对你有用。

所以在我的例子中,我有一个活动,我调用了一个包含Webview的片段,所以它比我想象的要复杂得多。

基本上,问题在于片段缺少这一行:

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

所以它没有意识到webview内部高度的变化。

无论如何,让我们进入代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    //mWebView.postUrl("https://www.google.com/");
    final View activityRootView = view;
    layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            //r will be populated with the coordinates of your view that area still visible.
            activityRootView.getWindowVisibleDisplayFrame(r);
            // This variable was created only for Debug purposes and 
            // to see the height change when clicking on a field inside mWebView
            int screenHeight = activityRootView.getRootView().getHeight();
            Log.d("onGlobalLayout", "rect: " + r.toString());
            Log.d("onGlobalLayout", "screenHeight: " + screenHeight);

            //The difference on the heights from bottom to top and on the root height
            int heightDiff = screenHeight - (r.bottom - r.top);
            Log.d("onGlobalLayout", "heightDiff: " + heightDiff);

            //I suggest to put 250 on resources and retrieve from there using getResources().getInteger() to have better order
            float dpx = dpToPx(getActivity(), 250);

            if (previousHeightDiff != heightDiff) {
                if (heightDiff > dpx) {
                    isSoftKeyboardPresent = true;
                } else {
                    isSoftKeyboardPresent = false;
                }
                previousHeightDiff = heightDiff;
            }
        }
    };
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
    return view;
}

private static float dpToPx(Context context, float valueInDp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}

记得把你的Androidanifest.xml设置上的活动设置为:android: windowSoftInputMode=调整大小|stateHidden

片段内的变量为:

public boolean isSoftKeyboardPresent = false;
private int previousHeightDiff = -1;// this is used to avoid multiple assignments
private ViewTreeObserver.OnGlobalLayoutListener layoutListener = null;

最后

@Override
public void onPause() {
    super.onPause();
    final View activityRootView = getActivity().findViewById(R.id.page_content);
    activityRootView.getViewTreeObserver().removeOnGlobalLayoutListener(layoutListener);
}

这应该会起作用:)那么你觉得呢?

 类似资料:
  • 问题内容: 理想情况下,我希望整个界面具有 自定义样式 ,该 样式 可以在ios(itouch / ipad)或具有等效虚拟键盘的android上看到。请参阅下面的更多细节。 当键盘“存在”时,自定义设置的CSS hacking规则处于活动状态也是一种可以接受的解决方案。 在网站(HTML / JavaScript / CSS)上同时定位android和ios。还请注意,内部布局为: “ flui

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 本文向大家介绍C#中如何检查线程是否处于活动状态,包括了C#中如何检查线程是否处于活动状态的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否存在,代码如下: 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-

  • 问题内容: 因此,我正在使用下载管理器在我的应用程序中下载多个文件。开始某些活动之前,我需要这些文件才能完成下载。如何检查是否有活动的下载,所以我可以告诉用户等待下载完成。然后,当它们完成时,我需要使按钮可见。我已经用谷歌搜索过,甚至自己(盲目地)尝试了一些代码,但没有任何效果。如果有人可以向正确的方向推动我,我将不胜感激。 问题答案: 使用打听下载。调用时,返回值是下载的ID。您还可以按状态查询

  • 问题内容: 都好 我有一个控制台项目,旨在让用户按下键盘方向键(非数字键盘)来移动化身。我在编码时很难检查是否按下了这些键。在Pascal中,使用“ readkey”和代码非常容易,例如,按下按键的代码为#80。但是,尽管我认为我了解System.in和BufferedInputStream的用法,但我对如何在Java中实现相同功能感到困惑。 有人可以帮我吗?非常感谢您的想法或提示。 问题答案: