【问题标题】:Why is Android WebView refusing user input?为什么 Android WebView 拒绝用户输入?
【发布时间】:2011-01-06 05:39:04
【问题描述】:

我正在开发一个使用 WebView 来显示 Facebook 登录页面的 Android 应用程序。页面加载得很漂亮,我可以选择用户名/密码文本框,但输入它们不起作用。也就是说,它们肯定有输入焦点(它们有橙色的焦点突出显示框和闪烁的光标),但输入它们绝对没有任何作用。我不确定,但我认为表单按钮可能也在播放 - 它们似乎只是刷新页面,而不是提交表单。

澄清一下,虽然我对让 Facebook 运行特别感兴趣,但我确信这不是 Facebook 问题,因为其他网站(谷歌等)也显示相同的行为。

有人知道可能是什么问题吗?

【问题讨论】:

    标签: android webview


    【解决方案1】:

    事实证明,问题显然是 WebView 没有焦点。

    我发现使用箭头键将焦点放在文本框上会导致它们工作,因此我推测某处存在没有焦点的问题,很可能是 WebView 没有焦点。果然,添加以下行似乎可以解决问题:

    webView.requestFocus(View.FOCUS_DOWN);
    

    我仍然无法准确解释为什么会首先出现问题 - 文本框应该可以工作,无论它们是通过被点击还是通过“箭头”来获得焦点 - 但至少我有一个解决方案似乎有效。

    感谢您的意见。

    【讨论】:

    • 对我不起作用.. 我不认为这是焦点问题,因为点击时会出现软键盘,而且光标在文本字段中闪烁。 (问题在于 facebook 登录页面)。请建议。
    • 我自己刚遇到这个问题,这个问题中提出的解决方案都没有为我工作,因为我使用的是WebViewFragment 并使用getWebView() 设置属性。对我有用的是子类WebViewFragment,覆盖onCreateView并从那里调用requestFocus(View.FOCUS.DOWN)
    【解决方案2】:

    @Mac 是否单行:

    webView.requestFocus(View.FOCUS_DOWN);
    

    解决了您的问题?在我的情况下我没有,但这确实:

    mWebView.setOnTouchListener(new View.OnTouchListener() { 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
               switch (event.getAction()) { 
                   case MotionEvent.ACTION_DOWN: 
                   case MotionEvent.ACTION_UP: 
                       if (!v.hasFocus()) { 
                           v.requestFocus(); 
                       } 
                       break; 
               } 
               return false; 
            }
    });
    

    仅供参考。

    【讨论】:

    • 优秀。在已经花了几个小时之后,我又节省了很多时间!谢谢。
    • 我还必须在触摸处理程序中请求焦点
    【解决方案3】:

    这些是最有的

    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setUseWideViewPort(true);
    webview.requestFocus(View.FOCUS_DOWN);
    

    如果仍然无法正常工作,请使用下面的一种替代方法

    备选方案 1

    webview.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_UP:                     
                        if (!v.hasFocus()) {
                            v.requestFocus();
                        }
                        break;
                }               
                return false;
            }
        });
    

    备选方案 2

    webview.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_UP:
                    v.requestFocusFromTouch();  
                    break;
            }               
            return false;
        }
    
    });
    

    【讨论】:

    • 备选方案 2 对我有用。不知道为什么视图没有成为前两个的焦点。
    • webview.requestFocus(View.FOCUS_DOWN); 成功了
    【解决方案4】:

    我不知道我的情况和你的一模一样,

    我发现添加一个 css 行可以解决问题。

    我只是添加

    input{
        -webkit-user-select: text;
    }
    

    到我的css,问题就解决了!

    【讨论】:

    • 你是天使,你知道吗?几天来我尝试了很多替代方案,而这个简单的解决方案是唯一真正完美运行的解决方案。救生员。谢谢
    • 这是最好的!许多坦克!
    【解决方案5】:

    我很遗憾地说这些都不适合我。我想这取决于你的上下文。就我而言,问题发生在一个 html 弹出窗口(绝对 div)中。所有其他输入字段都正常。

    分解问题后,我发现这是 webview 中的错误。包含其他固定/绝对位置 div 的固定定位 div 会破坏页面中的输入字段。因此,我为您制定了一条规则(不要犹豫重新制定):

    如果您的页面中有一个固定定位的 div 和非默认定位的嵌套 div(即绝对、固定等),则您的以下任何绝对定位 div包含输入字段的页面会出现意外行为。

    因此,请将您的输入字段放在页面顶部(如果可以的话)或避免绝对 div 嵌套在其他固定/绝对 div 中。这应该会有所帮助。

    如果您需要更多解释和潜在的解决方法,我在我的博客上发布了一些相关内容:http://java-cerise.blogspot.com/2012/02/android-web-view-inputfields-refuse-to.html

    【讨论】:

    • 这很有趣,有助于解释问题,但实际上并不是答案。我不能(例如)强迫 Facebook 更改其登录页面的布局,因为这会导致我的应用出现问题...
    【解决方案6】:

    在我的情况下,来自后堆栈中前一个片段的TabHost 在每次按键时从 WebView 输入中窃取焦点。这是我修复它的方法:

    tabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
      @Override
      public void onViewDetachedFromWindow(View v) {}
    
      @Override
      public void onViewAttachedToWindow(View v) {
        tabHost.getViewTreeObserver().removeOnTouchModeChangeListener(tabHost);
      }
    });
    

    有关该主题的更多信息,请参阅https://code.google.com/p/android/issues/detail?id=2516

    【讨论】:

      【解决方案7】:

      不确定是否是问题所在,因为其他网站也显示相同的行为,但是您是否启用了 javascript? WebView 默认不启用。

      WebView webView = (WebView)findViewById(R.id.yourWebView);
      webView.getSettings().setJavaScriptEnabled(true);
      

      【讨论】:

      • 是的,我已启用 JavaScript。我也不认为这应该是问题,因为 AFAIK 表单不依赖 JS 进行基本输入。我也尝试过使用 Facebook WAP 登录站点(它肯定不使用 JS),结果相同。不过还是谢谢。
      【解决方案8】:

      我花了很多时间来解决这个问题。最后,我意识到这与 WebView 无关。就我而言,我在对话框中有一个 webview。我想处理后按按钮以取消对话框并完成活动。我在下面写了代码:

      private void setOnBackPressed() {
          this.setOnKeyListener(new OnKeyListener() {
              @Override
              public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                  if (keyCode == KeyEvent.KEYCODE_BACK) {
                      dialog.dismiss();
                      activity.finish();
                  }
                  return true;
              }
          });
      }
      

      因此,当我使用键盘时,此方法会以某种方式拒绝所有按键,然后它不会出现在文本字段中。

      我只是把返回值改成了false。所以,它工作正常。

      希望对你有帮助!!

      PS:这个方法在我的对话框类中,它扩展了对话框类

      【讨论】:

        【解决方案9】:

        我尝试了此处发布的所有其他解决方案,但均无效。

        相反,我扩展了 WebView 并覆盖了强制 KeyEvent 调度的 InputConnection。

        @Override
        public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
          return new BaseInputConnection(this, false);
        }
        

        【讨论】:

          【解决方案10】:

          我遇到了这个问题,因为我在 webview 加载第一页时显示了一个启动图像。我在 onPageFinished 中将 webview 设置为 View.VISIBLE,但是尽管能够聚焦文本框,但您无法输入它们。我也可以确认将 webview requestFocus 设置为 View.FOCUS_DOWN 的修复工作。

          注意。如果我在 onResume 中将 webview 设置为 View.VISIBLE,则问题不会出现,但在我的情况下,启动图像很快就会消失。

          【讨论】:

          • 你什么时候设置FOCUS_DOWN?在 onPageFinished 中?
          【解决方案11】:

          我在 4.1.2 和 4.2.2 中加载页面时发生过,经过一天的搜索,我找到了答案 here(评论 #18)

          引用原帖:

          我使用WebView 渲染的各种网页中的一些不适合WebView,因此div(或其他一些html 组件)被无形地覆盖在输入字段上。尽管输入字段在触摸时显示为选中状态,但它们不允许文本输入(即使我确实设法使用轨迹球启动了软键盘)。

          所以解决办法。

          webview.getSettings().setUseWideViewPort(true);
          

          这不会完全解决问题,但会使视图更像是为网站设计的 PC 浏览器。覆盖的变化较少。

          【讨论】:

            【解决方案12】:

            我发现了一个可能不同但听起来相似的问题。在android 2.3原生浏览器中,如果页面上有固定位置的元素,有时会破坏选择框。

            针对 2.3 设备的此问题的解决方法是永远不允许空子元素用于固定位置的父元素。因此,

            <div style="position:fixed">
              <div>
                <span>not empty</span>
                <span></span>
              </div>
            </div>
            

            会变成

            <div style="position:fixed">
              <div>
                <span>not empty</span>
                <span>&nbsp;</span>
              </div>
            </div>
            

            这解决了我的问题。

            不知道这是否是您的问题的问题,这是事后一年多的事情,但我想我会分享,因为我目前正在处理应用程序上的另一个固定位置问题,并且我还没有找到解决方法。

            【讨论】:

              【解决方案13】:

              我遇到了类似的问题,文本输入在 webview 上不起作用。当您专注于文本输入时,它会显示键盘,但您无法输入任何字符。

              经过长时间的寻找解决方案,我发现这解决了问题:

              body {
                  -webkit-transform: translate3d(0,0,0);
                  -moz-transform: translate3d(0,0,0);
                  -ms-transform: translate3d(0,0,0);
                  -o-transform: translate3d(0,0,0);
                  transform: translate3d(0,0,0);
              }
              

              据我了解,这条规则使某些设备运行它们的硬件加速。 关于 translate3d(0,0,0) 的更多信息here.

              另一方面,根据这个article,不建议到处使用GPU加速。

              【讨论】:

                【解决方案14】:

                在我的上下文中(包含外部 URL 的 web 视图),此片段有效:

                    webview.setOnTouchListener(new View.OnTouchListener() {
                       @Override
                       public boolean onTouch(View v, MotionEvent event) {
                           switch (event.getAction()) {
                               case MotionEvent.ACTION_DOWN:
                               case MotionEvent.ACTION_UP:
                                   v.requestFocusFromTouch();  
                                   break;
                           }               
                           return false;
                       }
                
                });
                

                错误是因为每次触摸 webview 都会失去焦点!

                【讨论】:

                  【解决方案15】:

                  默认情况下,在 Android 中,Webview 允许用户输入基本配置:-

                  android:focusable="true"
                  android:focusableInTouchMode="true"
                  

                  & 启用了 JavaScript,但在我的情况下,请确保没有任何 活动/片段级别 可聚焦性阻塞

                  android:descendantFocusability="blocksDescendants"
                  

                  刚刚删除了这个,为我工作。因此,请交叉检查此类情况并相应地修复它们。

                  【讨论】:

                    【解决方案16】:

                    如果我们在WebView 中处理EditText,那么v.requestFocusFromTouch () 将无法工作,如果我们必须USER_AGENT 编写Mozilla / 5.0 (X11; Linux i686) 并且如果Mozilla / 5.0 (X11) 将工作正常; Linux x86_64)。

                    【讨论】:

                      【解决方案17】:

                      这也发生在我的项目中。以上方法我都试过了,都没有效果。最后,我通过使用对话框主题活动替换了原生对话框解决了这个问题。希望这可以帮助别人!

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-11-28
                        • 2011-06-16
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多