代码之家  ›  专栏  ›  技术社区  ›  Mac Umer

为什么Android WebView拒绝用户输入?

  •  35
  • Mac Umer  · 技术社区  · 15 年前

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

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

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

    16 回复  |  直到 11 年前
        1
  •  45
  •   Mac Umer    15 年前

    事实证明,问题显然在于网络视图没有焦点。

    我发现使用箭头键来获得文本框的焦点导致了它们的工作,所以我推断某个地方有一个问题没有焦点,很可能是WebView没有焦点。果然,添加以下行似乎可以解决问题:

    webView.requestFocus(View.FOCUS_DOWN);
    

    我仍然无法准确解释问题最初发生的原因——无论文本框是通过被点击还是通过被“箭头”指向来获得焦点,它们都应该工作——但至少我有一个似乎有效的解决方案。

    感谢您的输入wf。

        2
  •  15
  •   DiveInto    14 年前

    @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
  •  14
  •   touchchandra    11 年前

    这些都是我所拥有的

    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;
        }
    
    });
    
        4
  •  9
  •   Alien    7 年前

    我不知道我的案子和你的一模一样,

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

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

    到我的css,然后问题解决了!

        5
  •  6
  •   twingocerise    12 年前

    很抱歉,这些对我都不起作用。我想这取决于你的背景。在我的例子中,问题发生在html弹出窗口(绝对div)中。所有其他输入字段都正常。

    分解问题我发现这是webview中的一个bug。包含其他固定/绝对位置div的固定位置div在页面中打断输入字段。因此,我为您制定了一条规则(请毫不犹豫地重新制定):

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

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

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

        6
  •  5
  •   Maxim Kachurovskiy    10 年前

    就我而言 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
  •  2
  •   wf.    15 年前

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

    WebView webView = (WebView)findViewById(R.id.yourWebView);
    webView.getSettings().setJavaScriptEnabled(true);
    
        8
  •  2
  •   sembozdemir    9 年前

    我花了很多时间来解决这个问题。最后,我意识到这与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 . 因此,它工作正常。

    附言 :此方法位于扩展dialog类的my dialog类内

        9
  •  2
  •   afathman Trapti Gupta    7 年前

    我尝试了这里发布的所有其他解决方案,但没有一个有效。

    相反,我扩展了WebView并覆盖了InputConnection,这迫使KeyEvents进行分派。

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
      return new BaseInputConnection(this, false);
    }
    
        10
  •  1
  •   jhad    14 年前

    我遇到这个问题是因为我在webview加载第一页时显示了一个启动图像。我正在将webview设置为View.VISIBLE in onPageFinished,但是尽管能够聚焦文本框,但无法在其中键入内容。我也可以确认将webview requestFocus设置为View.FOCUS\u DOWN的修复程序是否有效。

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

        11
  •  1
  •   Mohsen Afshin    11 年前

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

    引述原文:

    我使用的各种网页中的一些 WebView 不适合这个房间 网络视图 结果,一个div(或其他一些html组件)被不可见地放置在输入字段上。尽管触摸输入字段时显示为选中,但它们不允许文本输入(即使我确实使用轨迹球将软键盘打开)。

    因此,解决方案。

    webview.getSettings().setUseWideViewPort(true);
    

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

        12
  •  0
  •   Daniel    11 年前

    对于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
  •  0
  •   Community noseratio    7 年前

    我面临着类似的问题,文本输入在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

        14
  •  0
  •   Cüneyt    8 年前

    在我的上下文(包含外部URL的webview)中,此片段起作用:

        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
  •  0
  •   Kamlendra Pandey    3 年前

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

    &已启用JavaScript,但请确保没有任何 聚焦阻塞 ,就我而言

    android:descendantFocusability="blocksDescendants"
    

    刚刚去掉这个,为我工作。因此,交叉检查此类案例&相应地修复它们。

        16
  •  -1
  •   Elltz    9 年前

    如果我们正在处理 EditText 在里面 WebView 那么 v.requestFocusFromTouch () 如果我们不得不这样做的话,这是行不通的 USER_AGENT 编写Mozilla/5.0(X11;如果Mozilla/5.0(X11;Linux x86_64)。

        17
  •  -1
  •   Falko    9 年前

    这也发生在我的项目中。我尝试了以上所有的方法,没有一种是有效的。最后,我解决了这个问题,用一个对话主题活动代替了本机对话。希望这能帮助别人!