我使用WebView作为我的Androind App。我遇到了问题并请求帮助解决方案。
HTML页面中有一个文本字段。当它“焦点”然后我打电话
mWebView.setFocusableInTouchMode(true);
在Java代码中,以便弹出Android软键盘让我键入。
问题是我需要在Java中使用多线程来处理某些进程并调用
mWebView.loadUrl(strJSCall);
作为回调来执行JavaScript函数,但键盘被隐藏了!
我尝试的方法是强制键盘再次显示。但是,当调用'loadUrl'时,键盘如何显示? 任何人都遇到同样的问题并已经解决了吗?
此致 JR。
答案 0 :(得分:5)
loadUrl的问题在于它会中断UI线程并仍然会关闭输入方法。唯一可行的方法是检查光标在webview上的内容,并覆盖webview上的默认loadUrl行为。
在自定义网页浏览中:
@Override
public void loadUrl(String url) {
HitTestResult testResult = this.getHitTestResult();
if (url.startsWith("javascript:)" && testResult != null && testResult.getType() == HitTestResult.EDIT_TEXT_TYPE)
{
//Don't do anything right now, we have an active cursor on the EDIT TEXT
//This should be Input Method Independent
}
else
{
super.loadUrl(url);
}
}
当您专注于webkit中的文本字段时,这将阻止本机端加载Javascript。它并不完美,但它避免了通过调整WebView的大小来确定您的文本字段是否可见的混乱。在webview中执行的Javascript应该仍能正常工作。
同样,如果您在键入时需要更新某些内容,则可能必须找到另一种方法让Java与不阻止UI线程的Javascript进行通信。这是一个我仍未解决的难题。
答案 1 :(得分:2)
我遇到了同样的问题,但尚未完全解决。
我可以在调用webView.loadUrl后强制键盘显示,首先你需要知道键盘是否显示,我使用了这个How to check visibility of software keyboard in Android?的修改版本
然后致电
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(webview, InputMethodManager.SHOW_IMPLICIT);
但是,如果像我一样,你需要在每次按键后与WebView中的JavaScript进行通信,那么这种方法会导致键盘在尝试上下动画时闪烁。
根据你输入的速度,它也会错过一些输入。
答案 2 :(得分:1)
在Android中,从WebView执行javascript是单向的:调用WebView.loadUrl(“javascript:sub(1,1)”);您无法直接获得返回值。
有一种异步方式来获取JavaScript函数的返回值: How to get return value from javascript in webview of android?
但在大多数情况下,我们需要一种同步方法而不是异步方式。例如,将click事件传递到Android WebView的onTouch 方法,我们想要执行一个JavaScript来读取点击的元素信息。
我尝试了两种解决方案: 1.使用Java P / V变量从异步打开同步方法,解决方案如下: How to get return value from javascript in webview of android?
解决方案完全不起作用,因为wait方法将阻止JavaScript和JavaScriptInterface的执行。所以,如果我们想得到一个js的结果 UI线程中的方法。这是不可能的。
效果很好,唯一需要注意的是页面加载完成时的初始反射方法。我试图在WebView的构造函数中初始化反射,但是失败了。我认为构造函数是异步方法。