当WebView再次调用'loadUrl'时,HTML文本输入中的键盘消失

时间:2010-12-27 03:52:53

标签: android

我使用WebView作为我的Androind App。我遇到了问题并请求帮助解决方案。

HTML页面中有一个文本字段。当它“焦点”然后我打电话

          mWebView.setFocusableInTouchMode(true);

在Java代码中,以便弹出Android软键盘让我键入。

问题是我需要在Java中使用多线程来处理某些进程并调用

          mWebView.loadUrl(strJSCall); 

作为回调来执行JavaScript函数,但键盘被隐藏了!

我尝试的方法是强制键盘再次显示。但是,当调用'loadUrl'时,键盘如何显示? 任何人都遇到同样的问题并已经解决了吗?

此致 JR。

3 个答案:

答案 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线程中的方法。这是不可能的。

  1. 使用Java Reflection获取stringByEvaluatingJavaScriptFromString的本地接口。 Exist stringByEvaluatingJavaScriptFromString for Android
  2. 效果很好,唯一需要注意的是页面加载完成时的初始反射方法。我试图在WebView的构造函数中初始化反射,但是失败了。我认为构造函数是异步方法。