【问题标题】:Android webview - shouldOverrideUrlLoading() not called in some jsp pagesAndroid webview - 在某些jsp页面中未调用shouldOverrideUrlLoading()
【发布时间】:2015-06-05 05:05:12
【问题描述】:

我一直在为许多拥有移动网站的公司开发混合应用程序。 事实上,有些网站是用jsp制作的。

我已经知道 iframe 和 javascripts xhr 请求不会触发 webViewClient 的 shouldOverrideUrlLoading 覆盖函数。我没问题。

但今天我了解到一些操作,例如:

  • JSP 页面重定向
  • JSP 页面中的链接点击次数
  • JSP/JS 引发的 URL 加载

不会总是触发这个函数。

因此,shouldOverrideUrlLoading() 不会触发,当要求 webView 加载它无法加载的页面(即“intent://...”)时,它会显示错误页面。

有没有人遇到过这种行为,有没有解决办法?

下面是我用来调用活动的代码,其中 url 带有 'intent:' 协议(这将失败,因为执行上述操作时永远不会调用此函数)

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // ... omitted ...
        if ( url.startsWith("intent:") ) {
            Intent intent = null;
            try {
                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                // The following flags launch the app outside the current app
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                try {
                    getActivity().startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            return true;
        }
}

ps。请注意,所有其他网站的页面加载都将完美调用 shouldOverrideUrlLoading()。 我在 android webViews 上找不到任何与 JSP 相关的错误,所以我要问一个。

ps。我很乐意提供一些有礼貌的读者会尝试的示例网站。但该网站是用韩文编写的,所以我怀疑它是否会有所帮助。

谢谢!

【问题讨论】:

    标签: android jsp webview webviewclient


    【解决方案1】:

    您的问题可能与 JSP 无关,真正的问题可能是 shouldOverrideUrlLoading() 本身。在这种情况下,使用shouldOverrideUrlLoading() 可能不是一个好主意,那么为什么不尝试其他视角呢?

    • 我在使用过程中遇到了很多问题 shouldOverrideUrlLoading() 加载 XmlHttpRequest。最后,我 使用onProgressChanged() 提出了这个想法,它解决了所有问题 我的问题。我写了一个类似的答案here

    我尝试将您的代码添加到我自己的 webview 项目中,并在一些 JSP 站点上对其进行了测试,并且看起来它总是可以工作。我还在其他activity调用后添加了loadUrl(),所以按下返回键后就不会再显示加载错误页面了。所以试试这个:

    首先声明一个全局变量来存储最后一个 URL。

    String strLastUrl = null;
    

    然后覆盖 onProgressChanged(WebView view, int progress)

        mWebView.setWebChromeClient(new MyWebChromeClient(){
        
           @Override
           public void onProgressChanged(WebView view, int progress) {
                    if (progress == 100) {
                        //A fully loaded url will come here
                        String StrNewUrl = view.getUrl();
                        if(TextUtils.equals(StrNewUrl,strLastUrl)){
                           //same page was reloaded, not doing anything
                        }else{
                           String strOldUrl = null;
                           //save old url to variable strOldUrl before overwriting it
                           strOldURL = strLastUrl;
                           //a new page was loaded,overwrite this new url to variable
                           strLastUrl = StrNewUrl;
    
                           if ( strLastUrl.startsWith("intent:") ) {
                               Log.d("TAG", "intent triggered");
                               Intent intent = null;
                               try {
                                    intent = Intent.parseUri(strLastUrl, Intent.URI_INTENT_SCHEME);
                                    // The following flags launch the app outside the current app
                                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                                    try {
                                        startActivity(intent);
                                    } catch (ActivityNotFoundException e) {
                                        e.printStackTrace();
                                    }
                                    //reload the page before invoking other activities
                                    view.loadUrl(strOldURL);
    
                                } catch (URISyntaxException e) {
                                    e.printStackTrace();
                                }
    
                            }
    
                        }
                    }
                    super.onProgressChanged(view, progress);
                }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2013-05-16
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多