Android webview执行loadUrl时隐藏键盘的workround

来源:互联网 发布:淘宝动态评分生效时间 编辑:程序博客网 时间:2024/06/11 13:26
webview执行loadUrl时隐藏键盘的workround
   在写webapp的时候,经常需要用JS调用Java方法,java方法执行完毕以后,再回调JS函数来做一些事情,而webview调用js的时候是通过loadUrl方法的,一执行loadUrl就会隐藏软键盘。因为每次loadUrl操作都会调用clearHelpers方法 clearHelpers方法中又会调用clearTextEntry方法,这个方法中会hideSoftKeyboard,那么有没有什么办法不隐藏呢。
   有两种办法:
   1)重写loadUrl方法,在调用super.loadUrl之前,记下softkeyboard的大小,在执行完super.loadUrl之后把softkeyboard显示出来(想想都疯了。。。不用这种方法)
   2)换个角度考虑,一般调用Java方法的时候会打断输入(因为隐藏了键盘),说明在这一段时间应该是较为频繁的调用Java方法,所以这种情况应该是较少时候出现的,那么可以给webview一个javascriptinterface, 将想要传递给js的参数在这个javascriptinterface提供给javascirpt代码调用。
      代码如下:
     
     定义一个类:
     public class JSInterface {
        public String getString(){
               return "2" ;    //在这里返回参数,这里是最简单的情况。。
       }
         }

     在webview那边:
     jsInterface = new JSInterface();
     webView.addJavascriptInterface( jsInterface, "JSInterface" );
     将这个javascriptinterface暴露给js

     在html js文件这边:
     setInterval(function() {
          counter++;
          var js = JSInterface.getString();
          document.getElementById( "value").value  = document.getElementById("value" ).value + js;
     }, 1000);

     每隔1秒通过Java取一次数据,更新界面,这样就softkeyboard就不会隐藏了
     
     上面的例子非常简单,可能大多数人觉得没什么用,实际上,在JSInterface.getString方法中可以做很多事情的。

     说到了AsyncTask, 需要知道刚开始所有AsyncTask都在一个线程中依次运行,在Android1.6以后改成多线程运行,在Android3.0以后,为了避免一些多线程的问题,又改成了单线程运行,如果先要AsyncTask多线程运行,需要自己建一个Executor,使用AsyncTask.executeOnExecutor方法运行。具体查看http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor(java.util.concurrent.Executor, Params...)

原创粉丝点击