如何强制Android Webview重新绘制DOM更改?

时间:2013-02-14 09:42:05

标签: android jquery dom webview updating

我目前正在开发一个门户网站,需要在Android Webview中作为本机应用程序的一部分运行。整个门户网站都是基于AJAX的。因此,无论何时提交表单,都会异步完成。根据响应,我需要提供一个消息框,上面写着“成功”或“错误”。我现在用jQuery做这个。问题是,Android Webview不会重新绘制,因此消息框将不可见。有用的是点击屏幕上的任何位置。这似乎迫使重新粉刷。不,我需要做的是:

1)DOM以其他方式更改,以便Android Webview正确处理它。

OR

2)通过触发一些(伪)事件或使用一些肮脏的黑客来强制重新绘制:)

有没有人遇到过这个问题?任何提示都非常受欢迎。

4 个答案:

答案 0 :(得分:4)

观看此video并阅读此answer。 诀窍是使用

    -webkit-transform: translate3d(0,0,0);
需要更新的div上的

css样式。这将创建一个新图层,动画/更新变得更加顺畅。

答案 1 :(得分:1)

我从来没有遇到过显示来自非Async调用的DOM更新的问题,所以也许解决方案是让你的异步方法回调一个注入的对象(WebView.addJavascriptInterface()) - 然后运行调用UI线程到Webview来更新UI?

答案 2 :(得分:1)

想要得到你想要的结果只是一个不同的想法:

只要通过jQuery工作,您是否尝试在WebView上启用JavaScript? 通过这种方式,您应该能够在WebView中执行JavaScript代码(并且可能会从jQuery中看到更改)。

myWebView.getSettings().setJavaScriptEnabled(true);

答案 3 :(得分:1)

以下是我每次强制更新webview的方法,请参阅以下代码:// WEBVIEW

package com.example.scroll;
// philip r brenan at gmail.com, www.appaapps.com 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;

public class MainActivity extends Activity
 {protected void onCreate(Bundle savedInstanceState)
   {super.onCreate(savedInstanceState);
    setContentView(new MyWebView(this)); 
   }
  class MyWebView extends WebView 
   {MyWebView(Context Context)
     {super(Context);
      getSettings().setJavaScriptEnabled(true);
      addJavascriptInterface(this, "Android");   
      new Thread()
       {public void run()
         {for(int j = 0; j < 100; ++j)
           {post(new Runnable()
             {public void run()
               {loadData(content(), "text/html", "utf-8"); // Display in browser
               }
             });    
            try {Thread.sleep(5000);} catch(Exception e) {}
           }  
         }
       }.start();
     } 
    int c = 0, C = 1;
    String content() 
     {final StringBuilder s = new StringBuilder();
      //s.append("<html id="+(C++)+"><body>"); // WEBVIEW REFRESHES CORRECTLY *************** 
      s.append("<html><body>");              // WEBVIEW DOES NOT REFRESH ******************

      s.append("<h1 id=11>1111</h1>");
      s.append("<script>location.href = '#22';</script>");
      for(int i = 0; i < 10; ++i) s.append("<p>"+c+c+c); ++c;

      s.append("<h1 id=22>2222</h1>");
      for(int i = 0; i < 10; ++i) s.append("<p>"+c+c+c); ++c;
      Log.e("AAAAAA", "content="+s.toString());
      s.append("</body></html>");
      return s.toString();
     }
   } 
 }