6

我正在使用 Android 和 Phonegap,目前我在一件简单的事情上遇到了麻烦。我需要为 PhoneGap webView 设置一个 webViewClient,以便捕获完成的页面的 URL 并使用它。

这是代码:

public class PhoneGapTest extends DroidGap {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.setBooleanProperty("loadInWebView", true);
        super.clearCache();
        super.keepRunning = false; 
        super.loadUrl("file:///android_asset/www/index.html");

        super.appView.setWebViewClient(new WebViewClient(){

          @Override
          public void onPageStarted(WebView view, String url, Bitmap bitmap) {

            Log.i("TEST", "onPageStarted: " + url);

          }

          @Override
          public void onPageFinished(WebView view, String url) {

            Log.i("TEST", "onPageFinished: " + url);

          }

        });

    }

该代码似乎不起作用,页面永远不会加载并且我得到一个超时错误,但是如果我删除“setWebViewClient”部分页面加载完美。

我看到有一个类 CordovaWebViewClient,我必须使用它而不是 WebViewClient 吗?我在网上找到了这种方法:

        this.appView.setWebViewClient(new CordovaWebViewClient(this){

          @Override
          public boolean shouldOverrideUrlLoading(final WebView view, String url) { 
            Log.i("BugTest", "shouldOverrideUrlLoading: " + url); 
            return true; 
          }

          @Override
          public void onPageStarted(WebView view, String url, Bitmap bitmap) {

            Log.i("TEST", "onPageStarted: " + url);

          }

          @Override
          public void onPageFinished(WebView view, String url) {

            Log.i("TEST", "onPageFinished: " + url);

          }

          @Override
          public void doUpdateVisitedHistory(WebView view, String url, boolean isReload){        
          }

        });

但是该代码也不起作用,我仍然遇到超时错误。我还看到已经有一个 webVieClient 成员,但如果我必须使用它以及如何使用它,我没有。

我正在使用 Phonegap 1.9.0 版

谢谢阅读


回复西蒙:

它以这种方式工作,谢谢!

public class MainActivity extends DroidGap {

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    super.init();
    super.appView.clearCache(true);
    super.appView.clearHistory();
    this.appView.setWebViewClient(new CustomCordovaWebViewClient(this));
    super.loadUrl("file:///android_asset/www/index.html");
}

public class CustomCordovaWebViewClient extends CordovaWebViewClient {

 public CustomCordovaWebViewClient(DroidGap ctx) {
   super(ctx);
 }

 @Override
 public void onPageStarted(WebView view, String url, Bitmap bitmap) {
   super.onPageStarted(view, url, bitmap);
   Log.i("TEST", "onPageStarted: " + url);
 }

 @Override
 public void onPageFinished(WebView view, String url) {
   super.onPageFinished(view, url);
   Log.i("TEST", "onPageFinished: " + url);
 }

 @Override
 public void doUpdateVisitedHistory(WebView view, String url, boolean isReload){  
     super.doUpdateVisitedHistory(view, url, isReload);  
 }

 @Override
 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
     super.onReceivedError(view, errorCode, description, failingUrl);
 }

}

}
4

3 回答 3

7

我想我已经在最新的 Cordova 版本(我使用的是 2.2)上发现了这一点。它失败了,onPageStarted()因为它期待一个为空的 appView。设置 appView 似乎可以修复它,例如

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.init();

    CordovaWebViewClient webViewClient = new CustomAcceptingWebViewClient(this);
    webViewClient.setWebView(this.appView);
    this.appView.setWebViewClient(webViewClient);

    super.loadUrl("file:///android_asset/www/index.html");

}

请注意,super.init()也需要

于 2012-11-30T00:46:29.317 回答
5

为了完成您想做的事情,我将扩展 CordovaWebViewClient 类并覆盖您想要的方法,但不要忘记调用超级方法,否则 PhoneGap 将无法在没有 CordovaWebViewClient 的情况下工作,因为它是一个重要的类。

于 2012-07-04T01:56:17.930 回答
0

你忘了打电话给 super ;)

    // Assign webclient.
    this.appView.setWebViewClient(new CordovaWebViewClient(me, this.appView) {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    });
于 2015-03-14T16:14:48.863 回答