我正在开发一个Android应用程序,它使用WebView显示Facebook的登录页面.页面加载很漂亮,我可以选择用户名/密码文本框,但输入它们将无法正常工作.也就是说,它们肯定有输入焦点(它们有橙色焦点高亮框和闪烁的光标),但输入它们绝对没有任何效果.我不确定,但我想也许表单按钮也在播放 - 它们似乎只是刷新页面,而不是提交表单.
需要明确的是,虽然我对Facebook的运行特别感兴趣,但我确信这不是Facebook的问题,因为其他网站(谷歌等)也表现出同样的行为.
有没有人有任何想法可能是什么问题?
事实证明,显然WebView没有焦点就是问题.
我发现使用箭头键来关注文本框会导致它们工作,所以我认为某个地方有一个没有焦点的问题,很可能是WebView没有焦点.果然,添加以下行似乎可以解决问题:
webView.requestFocus(View.FOCUS_DOWN);
我仍然无法解释为什么问题发生在第一位 - 文本框应该有效,无论他们是通过点击还是通过"箭头"获得焦点 - 但至少我有一个似乎有效的解决方案.
感谢您的输入.
@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);
如果仍然没有工作,那么使用下面的一个替代
备选方案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; } });
我不知道我的情况与你的情况完全相同,
我发现添加一个css行可以解决问题.
我只是补充一下
input{ -webkit-user-select: text; }
到我的CSS,然后问题解决了!
我很遗憾地说这些对我都没有用.我想这取决于你的背景.在我的情况下,问题发生在一个html弹出窗口(绝对div).所有其他输入字段都正常.
打破这个问题我发现它是webview中的一个错误.包含其他固定/绝对位置div的固定定位div在页面中打破输入字段.因此,我为你做了一个规则(不要犹豫重新制定):
如果在你的页面中你有一个固定的定位div,没有默认定位的嵌套div(即绝对,固定等),以下任何绝对在包含输入字段的页面中定位div将获得意外行为.
因此,将输入字段放在页面顶部(如果可以)或避免嵌套在其他固定/绝对div中的绝对div.这应该有所帮助.
如果您需要更多解释和可能的解决方法,我在我的博客上发布了一些相关信息:http://java-cerise.blogspot.com/2012/02/android-web-view-inputfields-refuse-to.html
在我的情况下,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.