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

5
我正在开发一个需要在本地应用程序的Android Webview中运行的Web门户。整个门户是基于AJAX的。因此,每当表单被提交时,都会异步进行。根据响应,我需要呈现一个消息框,显示“成功”或“错误”。目前我使用jQuery来实现这个功能。问题是,Android Webview不会重新绘制,因此消息框不会显示。唯一有效的解决方法是在屏幕上点击任意位置。这似乎可以强制重新绘制。现在我需要做的是:
1)以另一种方式进行DOM更改,使Android Webview正确处理它。

2)通过触发某些(伪)事件或使用某些肮脏的技巧来强制重新绘制。
有人遇到过这个问题吗?任何提示都将不胜感激。
4个回答

4
观看这个视频并阅读这个答案。 关键在于使用


    -webkit-transform: translate3d(0,0,0);
需要更新的div上使用CSS样式,这将创建一个新的层,使动画/更新更加流畅。

1

Here is how I forced webview to update each time, please see the code at: // 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();
     }
   } 
 } 


这个回答放置括号的方式是我见过最性感的 :-) - neevek

1

为了实现您想要的结果,这里提供另一种思路:

由于此方法使用jQuery,您尝试在WebView上启用JavaScript了吗? 这样,您应该能够在WebView中执行JavaScript代码(可能会看到来自jQuery的更改)。

myWebView.getSettings().setJavaScriptEnabled(true);

1
我从未遇到过显示非异步调用的DOM更新方面的问题,因此也许一个解决方案是让您的异步方法回调到一个注入的对象(WebView.addJavascriptInterface()),然后在UI线程上运行对Webview的调用以更新UI?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接