36

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

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

有谁知道可能是什么问题?

4

17 回答 17

45

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

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

webView.requestFocus(View.FOCUS_DOWN);

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

感谢您的输入。

于 2010-01-18T23:19:31.717 回答
15

@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; 
        }
});

仅供参考。

于 2010-10-20T05:55:46.863 回答
14

这些最有

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;
    }

});
于 2013-11-19T15:36:00.913 回答
9

不知道我的情况和你的完全一样

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

我只是添加

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

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

于 2015-03-06T08:42:15.803 回答
6

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

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

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

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

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

于 2012-02-29T14:17:05.920 回答
5

在我的例子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

于 2014-12-17T15:21:30.327 回答
2

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

WebView webView = (WebView)findViewById(R.id.yourWebView);
webView.getSettings().setJavaScriptEnabled(true);
于 2010-01-18T07:27:04.687 回答
2

我花了很多时间来解决这个问题。最后,我意识到这与 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:这个方法在我的对话框类中,它扩展了 Dialog 类

于 2015-08-16T14:34:21.277 回答
2

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

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

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
  return new BaseInputConnection(this, false);
}
于 2017-04-27T14:53:50.717 回答
1

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

引用原帖:

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

所以解决方案。

webview.getSettings().setUseWideViewPort(true);

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

于 2013-07-16T19:39:46.147 回答
1

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

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

于 2010-08-13T02:49:50.627 回答
0

in my context (webview containing an external URL), this fragment works:

    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;
       }

});

the error is because at every touch the webview was losing the focus!

于 2014-07-29T12:51:44.590 回答
0

我发现了一个可能不同的问题,但听起来很相似。在 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>

这解决了我的问题。

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

于 2013-06-18T22:16:43.313 回答
0

我遇到了类似的问题,文本输入在 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) 的更多信息,请点击此处。

另一方面,根据这篇文章,不建议到处使用 GPU 加速。

于 2015-05-04T13:25:55.590 回答
0

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

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

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

android:descendantFocusability="blocksDescendants"

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

于 2021-07-21T16:35:07.197 回答
-1

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

于 2015-04-16T16:49:52.450 回答
-1

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

于 2015-07-03T09:19:41.013 回答