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

时间:2010-01-18 04:31:10

标签: android webview

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

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

有没有人有任何想法可能是什么问题?

16 个答案:

答案 0 :(得分:44)

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

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

webView.requestFocus(View.FOCUS_DOWN);

我仍然无法解释为什么问题出现在第一位 - 文本框应该有效,无论他们是通过点击还是通过“箭头”获得焦点 - 但至少我有一个解决方案,似乎工作。

感谢您的输入wf。

答案 1 :(得分: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; 
        }
});

仅供参考。

答案 2 :(得分: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;
    }

});

答案 3 :(得分:8)

我不知道我的情况和你的情况完全相同,

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

我只是添加

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

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

答案 4 :(得分: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

答案 5 :(得分: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

答案 6 :(得分:2)

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

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

答案 7 :(得分:2)

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

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

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

引自原帖:

我使用WebView呈现的各种网页中的某些网页不适合WebView,因此div(或其他一些html组件)无形地放在输入上领域。尽管输入字段在触摸时显示为选中状态,但它们不允许输入文本(即使我确实设法使用跟踪球获得软键盘)。

所以解决方案。

webview.getSettings().setUseWideViewPort(true);

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

答案 10 :(得分: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>

这解决了我的问题。

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

答案 11 :(得分:0)

在我的上下文(包含外部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都失去了焦点!

答案 12 :(得分: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)here.

的更多信息

另一方面,根据此article,不建议在任何地方使用GPU加速。

答案 13 :(得分:0)

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

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

& 启用 JavaScript,但确保没有任何 活动/片段级别可聚焦性阻塞,就我而言

android:descendantFocusability="blocksDescendants"

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

答案 14 :(得分:-1)

如果我们在EditText处理WebView,那么v.requestFocusFromTouch ()如果我们必须USER_AGENT编写Mozilla / 5.0(X11; Linux i686)并且将会如果是Mozilla / 5.0(X11; Linux x86_64)。

答案 15 :(得分:-1)

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