【问题标题】:Android WebView - navigating back on URL redirectionAndroid WebView - 导航回 URL 重定向
【发布时间】:2011-10-24 01:59:24
【问题描述】:

我有一个关于 Android 网络视图的问题。

假设 URL A 重定向到 URL B。

我的 android 应用程序尝试打开 URL A 时,webview 会自动重定向到 URL B。

如果一个 URL 被重定向到其他一些 url,我看到这两个 url 都存储在 webview 历史记录中。现在我的 webview 历史记录由 [, , URL A, URL B]

在从 URL B 网页点击返回键时,webview 将尝试加载 URL A,它再次重定向到 URL B。我们需要双击返回键才能返回到 URL A 之外

我该如何解决这个问题?过去2小时的挣扎:(

【问题讨论】:

标签: android


【解决方案1】:

我也有同样的问题,并且想出了如何解决它。就像你的一样。当我单击第一个链接(www.new.a)时,它会自动重定向其他链接(mobile.new.a)。通常链接重定向两个或三个,我的解决方案几乎适用于每个重定向链接。我希望这个答案可以帮助您解决 annyoing 重定向链接。

我终于明白了。您需要一个带有四个 API 的 WebViewClient。 WebViewClient中有shouldOverrideUrlLoading()、onPageStarted()、onPageFinished()和doUpdateVisitedHistory()。您需要的所有 API 都是 API 1,所以不用担心。

事情是这样的。您可以使用其他函数而不是 onKeyUp()。

public class MyWebView extends WebView{
    ...
    private int mRedirectedCount=0;
    .... 

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && this.canGoBack()) {
            if(mRedirectedCount>0){
                while(mRedirectedCount>0){
                    this.goBack();
                    mRedirectedCount--;
                }
                mRedirectedCount=0; //clear
            }else{
                this.goBack();
            }
        return true;
    }

    private class MyWebViewClinet extends WebViewClient{
        boolean mIsPageFinished=true;
        ...    

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            .....
            if(mIsPageFinished){
                mRedirectedCount=0; //clear count
            }
            .....
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            mIsPageFinished = false;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            mIsPageFinished = true;
        }

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

            if(!mIsPageFinished){
                mRedirectedCount++;
            }
        }

【讨论】:

  • 我使用 OnBackPressed() 而不是 onKeyUp,但它不起作用
【解决方案2】:
private class HelloWebViewClient extends WebViewClient {
}

mWebView.setWebViewClient(new HelloWebViewClient());

如果覆盖 shouldOverrideUrlLoading(),则返回 false。 可能不是正确的方法,但它对我有用。

【讨论】:

  • 这应该是公认的答案。在 shouldOverrideUrlLoading() 处返回 true 是首先触发问题的原因,因为 API 将其视为显式 URL 加载,它被添加到后台堆栈,而不被视为常见重定向(未添加到后台堆栈)。
  • 我同意这应该是公认的答案。返回 false 会产生预期的结果。 developer.android.com/reference/android/webkit/…
【解决方案3】:

我也有这个问题,现在已经解决了。

solution

**如果提供了 WebViewClient,返回 true 表示宿主应用程序处理 url,返回 false 表示当前 WebView 处理 url。 **

【讨论】:

    【解决方案4】:

    尝试重载 OnBackPressed() 以覆盖默认的硬键返回操作。在那里你可以完成当前的活动或控制你想要的方式。

    【讨论】:

    • 没有得到你。如何知道该 URL 是重定向 URL 还是常规 URL?另外,是否可以从 webview 历史记录中删除特定的 URL?
    猜你喜欢
    • 2011-06-25
    • 2019-04-17
    • 1970-01-01
    • 2012-06-26
    • 2017-06-27
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多