Android webview中隐藏在键盘下方的文本框

Posted

技术标签:

【中文标题】Android webview中隐藏在键盘下方的文本框【英文标题】:Textbox hidden below keyboard in Android webview 【发布时间】:2011-10-25 00:09:23 【问题描述】:

我创建了一个简单的 iPhone/android 应用程序,其中包含一个普通的 webview。这个 webview 调用我的网站。

在我的网站上有几种输入类型=文本或文本区域的表单。当它们位于页面底部时,我遇到了问题!

1) 在我的 iPhone 应用程序中,键盘会自动出现并将文本框推送到手机屏幕的可见区域。所以没什么可做的。

2) 但在我的 Android 应用程序中,文本框将保持在同一个位置,并最终被我的键盘隐藏。所以用户唯一的选择就是输入“blind”。

我该如何解决这个问题?有没有其他人遇到过这个问题?

【问题讨论】:

您能否显示您遇到问题的页面底部的屏幕截图。 检查这个[链接][1]。尝试这个。这些可能会帮助你。 [1]:***.com/questions/2559273/… 感谢您的回答。在 AndroidManifest.xml 中,我在 >android:screenOrientation="portrait"android:windowSoftInputMode="adjustResize" 这里是全屏模式的解决方案:***.com/a/19494006/3248593 【参考方案1】:

这就是我解决问题的方法。正如Venky所说,您必须添加

android:windowSoftInputMode="adjustResize"

到 AndroidManifest.xml 文件中的标记。但在我们的案例中,这还不够。确保您对视图、网络视图等也这样做。然后我们终于让它工作了。

【讨论】:

我面临同样的问题。是否可以以编程方式为所有视图设置标签? 嗨@andreas,尝试遵循您和 Sandro 的想法,所以我创建了 <style name="StyleWindowSoftInputModeAdjustResize" > <item name="android:windowSoftInputMode">adjustResize</item> <item name="android:windowFullscreen">false</item> </style> 并将其应用到我的 web 视图 WebView webview = new WebView(this, null, R.style.StyleWindowSoftInputModeAdjustResize); 但是当我点击里面的某个输入框时没有显示软键盘在 WebView 中加载的页面...我的 WebView 位于 Horizo​​ntalScrollView 内,而后者位于垂直 ScrollView 内。 这听起来可以用于Android开发。但是 Appcelerator Titanium 的开发呢?这种东西有一个地方,但它只适用于Android应用程序,而不是移动网络应用程序(我试过)。实际上,它给了我一个错误,因为此值的命名空间不适用于移动网站:/ 如果您没有任何 Titanium 开发经验并且不知道答案,我会理解。 请注意,如果您使用windowFullscreen="true"android:theme="some style containing windowFullScreen=true",例如android:theme="@android:style/Theme.NoTitleBar.Fullscreen"windowSoftInputMode 将不起作用。 除了全屏模式,将状态栏设置为半透明(android:windowTranslucentStatus = true)也会使adjustResize无法工作。【参考方案2】:

我快疯了android:windowSoftInputMode="adjustResize" 可能会有所帮助,但请确保您的应用不要全屏显示。

为我的应用删除全屏解决了使用软键盘调整布局大小的问题。

<item name="android:windowFullscreen">false</item>

【讨论】:

我需要我的应用全屏 - 有没有办法让它全屏(即没有标题/警报栏)并且键盘不覆盖字段? 是的,我还需要我的应用程序是全屏的。您对此有解决方案吗? 不,很抱歉,在这个问题上浪费了太多时间后,我选择不使用全屏应用程序,如果您找到任何解决方案,请添加您的解决方案。 我也有同样的问题。我希望我的应用全屏显示。 我也有android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 阻止adjustResize 工作。仅使用 android:theme="@android:style/Theme.NoTitleBar" 使 adjustResize 工作。【参考方案3】:

是的,在使用 Webview 时遇到了同样的问题,我的问题是在模式上提交了输入。文本字段没有在键盘上方“聚焦”。 解决方案是延迟函数调用。希望有人觉得这很有用。

   $("body").on("click", ".jstree-search-input", function ()   

    setTimeout(function() 
        androidScroll(); 
    , 500);
    );

如您所见,它用于 jstree 输入...

   function androidScroll() 
    // Webview focus call (pushes the modal over keyboard)
        $('.control-sidebar-open ').scrollTop($('.control-sidebar-open ')[0].scrollHeight);

【讨论】:

【参考方案4】:

这会起作用:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

【讨论】:

【参考方案5】:

在解决这个问题时我学到了一些东西 --- 1. 主题风格不应包含 Fullscreen True 2.添加android:windowSoftInputMode="adjustResize" 3. 去掉 android:scrollbars="none" is any.. . 干杯!

【讨论】:

【参考方案6】:

请注意,除了建议的答案

android:windowSoftInputMode="adjustResize"

当您处于沉浸式模式时工作

【讨论】:

【参考方案7】:

在我的例子中,取得的成功是:

    在manifest、webview和fragment中添加以下内容:

    android:windowSoftInputMode="adjustResize"
    

    使用非全屏主题,如下所示:

    <style name="AppTheme" parent="android:Theme.Black.NoTitleBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowFullscreen">false</item>
    </style>
    
    不使用 ScrollView 而不是 WebView。

【讨论】:

【参考方案8】:

对于全屏模式的activity,android:windowSoftInputMode="adjustResize" 将不起作用。

https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_FULLSCREEN

全屏窗口将忽略窗口的 softInputMode 字段的 SOFT_INPUT_ADJUST_RESIZE 值;窗口将保持全屏状态并且不会调整大小。

我在 Activity 中使用以下方法通过设置底部填充来调整布局大小:


    public void adjustResizeOnGlobalLayout(@IdRes final int viewGroupId, final WebView webView) 
        final View decorView = getWindow().getDecorView();
        final ViewGroup viewGroup = (ViewGroup) findViewById(viewGroupId);

        decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
            public void onGlobalLayout() 
                DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
                Rect rect = new Rect();
                decorView.getWindowVisibleDisplayFrame(rect);
                int paddingBottom = displayMetrics.heightPixels - rect.bottom;

                if (viewGroup.getPaddingBottom() != paddingBottom) 
                    // showing/hiding the soft keyboard
                    viewGroup.setPadding(viewGroup.getPaddingLeft(), viewGroup.getPaddingTop(), viewGroup.getPaddingRight(), paddingBottom);
                 else 
                    // soft keyboard shown/hidden and padding changed
                    if (paddingBottom != 0) 
                        // soft keyboard shown, scroll active element into view in case it is blocked by the soft keyboard
                        webView.evaluatejavascript("if (document.activeElement)  document.activeElement.scrollIntoView(behavior: \"smooth\", block: \"center\", inline: \"nearest\"); ", null);
                    
                
            
        );
    

【讨论】:

它在这个答案中使用 javascript 对我有用,我以不同的方式运行它,但它就像一个魅力! document.activeElement.scrollIntoView(behavior: \"smooth\", block: \"center\", inline: \"nearest\")

以上是关于Android webview中隐藏在键盘下方的文本框的主要内容,如果未能解决你的问题,请参考以下文章

Android中键盘上方的FloatingActionButton和隐藏在键盘下方的BottomNavigationView

虚拟键盘隐藏字段/文本区域/内容可编辑(隐藏在键盘下方)

如何使用adjustResize设置隐藏键盘下方的BottomNavigationView

Android webview中的js如何监听键盘事件

为表单字段显示软键盘时,Android 4.3 Webview 不滚动

WebView 选择导致软键盘暂时隐藏然后回来