为什么Android WebView拒绝用户input?

我正在开发一个Android应用程序,使用WebView来显示Facebook的login页面。 页面加载得很漂亮,我可以select用户名/密码文本框,但是input它们是行不通的。 也就是说,他们肯定有input焦点(他们有橙色的焦点高亮框和一个闪烁的光标),但打字他们什么都没有。 我不确定,但我想也许表单button也在起作用 – 它们似乎只是刷新页面,而不是提交表单。

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

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

事实certificate,这显然是WebView没有关注的问题。

我发现使用箭头键将焦点放在文本框上导致它们工作,所以我推理出现问题,某些地方没有焦点,很可能是WebView没有焦点。 果然,添加下面的行似乎解决了这个问题:

webView.requestFocus(View.FOCUS_DOWN); 

我仍然无法解释为什么这个问题首先发生 – 文本框应该工作,无论他们是通过点击还是通过“箭头”的重点 – 但至less我有一个似乎工作的解决scheme。

感谢您的inputwf。

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

只是为了您的参考。

这些是最有的

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

如果仍然不能正常工作,请使用下面的替代方法

替代scheme1

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

我很抱歉地说,这一切都没有为我工作。 我想这取决于你的上下文。 在我的情况下,问题发生在一个HTMLpopup(绝对股利)。 所有其他的input字段都没问题。

打破这个问题,我发现这是在web视图中的错误。 固定位置的div包含其他固定/绝对位置divs在页面中断input字段。 因此,我为你写了一个规则(不要犹豫重写):

如果在你的页面中你有一个固定的位置的div与非默认定位嵌套divs(即绝对,固定等),任何下面的绝对定位div在你的页面包含input字段将得到意想不到的行为。

所以,把你的input字段放在页面的顶部(如果可以的话),或避免绝对div嵌套在其他固定/绝对div。 这应该有所帮助。

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

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

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

我只是补充一下

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

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

在我的情况下,从后面堆栈中的前一个片段的TabHost窃取每个按键上的WebViewinput焦点。 这是我如何解决它:

 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

不知道这是否是因为其他网站也显示相同的行为,但你有JavaScript吗? WebView默认情况下不启用它。

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

我尝试了所有其他解决scheme张贴在这里,没有一个工作。

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

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

我遇到了这个问题,因为我正在显示一个初始图片,而webview加载第一页。 我将webview设置为onPageFinished中的View.VISIBLE,但是尽pipe能够将文本框对焦,但却无法input。 我也可以确认,将webview的requestFocus设置为View.FOCUS_DOWN的修复工作。

NB。 如果我在onResume中将webview设置为View.VISIBLE,问题不会出现,但在我的情况下,飞溅的图像过早消失。

我发现在4.1.2和4.2.2中加载了一个页面,经过一天的search,我find了答案(注释#18)

从原帖引用:

我使用WebView呈现的各种网页中的一些不适合WebView ,结果div(或其他html组件)被无形地放置在input字段上。 虽然input字段在触摸时出现,但它们不允许input文字(即使我设法使用追踪球来获得软键盘)。

所以解决scheme。

 webview.getSettings().setUseWideViewPort(true); 

这并不能完全阻止这个问题,而是使得这个视图更像是一个PC浏览器,这些浏览器是为了devise的。 减less覆盖的变化。

我发现了一个可能不同的问题,但听起来很相似。 在android 2.3本机浏览器中,如果你在页面上有固定的位置元素,它有时会打破select框。

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> 

这解决了我的问题。

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

我面临类似的问题,文字input不起作用的web视图。 当您专注于文字input时,会显示键盘,但不能input任何字符。

经过漫长的search解决scheme,我发现这解决了这个问题:

 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)的信息。

另一方面,根据这篇文章 ,不build议在任何地方使用GPU加速。

我花了很多时间来解决这个问题。 最后,我意识到这不是关于WebView。 在我的情况下,我有一个webview里面的对话框。 我想要处理回button以取消对话框,并完成活动。 我写了下面的代码:

 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类的对话框类中

在我的上下文(webview包含一个外部的URL),这个片段的工作原理:

  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失去了重点!

如果我们正在处理WebView EditText ,那么如果我们需要USER_AGENT编写Mozilla / 5.0(X11; Linux i686),则v.requestFocusFromTouch ()将不起作用,如果Mozilla / 5.0(X11; Linux x86_64)将正常工作。

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