如何在Cordova / PhoneGap中处理页面重新加载

时间:2013-06-21 13:18:47

标签: android cordova android-webview

我有一个使用History API的Cordova / PhoneGap应用程序。它使用History API作为Web和Cordova应用程序之间的共享代码。移动webKit看起来像支持History API(但实际上支持是错误的)。

所以在某些地方客户端js-code生成document.location.reload,当前url可以是ANY(与初始url不同)。在Cordova应用程序中,这导致“应用程序错误:网络错误(文件:///显示/ ...)”。那是因为之前有history.pushState(“/ display / ..”)。

事实上,我可以修改它创建history.pushState的客户端代码,但我不喜欢这样做。

相反,我希望处理Cordova Java代码中的url加载并将其重定向到“index.html”(assets / www中的主应用程序页面)的加载。

怎么做?

我试图用我自己的实现覆盖CordovaWebViewClient:

    CordovaWebViewClient webViewClient = new MyWebViewClient(this, this.appView);
    this.appView.setWebViewClient(webViewClient);

其中override shouldOverrideUrlLoading:

public boolean shouldOverrideUrlLoading(WebView webView, String url) {

    if (url.startsWith("file:///display/"))
        return true;

    return super.shouldOverrideUrlLoading(webView, url);
}

但是从客户端js代码重新加载页面时不会调用该方法。

1 个答案:

答案 0 :(得分:0)

这是我提出的解决方案:

public class MyApp extends DroidGap
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        CordovaWebViewClient webViewClient = new MyWebViewClient(this, this.appView);        
        this.appView.setWebViewClient(webViewClient);        
    }
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MyWebViewClient extends CordovaWebViewClient {
   private DroidGap context;

   public MyWebViewClient(DroidGap ctx, CordovaWebView view) {
       super(ctx, view);
       this.context = ctx;
   }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) 
    {
        if (url.startsWith("file:///display/")) {
            InputStream stream;
            try {               
                stream = this.context.getAssets().open("www/index.html");
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
            WebResourceResponse response = new WebResourceResponse ("text/html", "utf-8", stream);
            // this' important as page has many other assets,
            view.loadUrl(Config.getStartUrl());
            return response;
        }
        return super.shouldInterceptRequest(view, url);
    }
}