WebView没有重定向的历史记录

jre*_*ca1 14 browser android google-chrome android-webview

我为back key实现了android webview和onKeyDown方法.(它实现webview.goBack();)

我的问题与下面这篇文章中的问题完全相似(没有答案)

如何控制Android WebView历史/后台堆栈?

问题 - 当我按下后退按钮时,webview选择以前的URL,但如果该URL实际上是重定向,则会进入此恶性循环/循环.如果您查看chrome或stock浏览器,它可以正确处理后退,而无需返回重定向.

怎么解决这个问题?

示例:转到gap.com.然后选择"我的差距信用卡".这将打开一个重定向链接,然后打开最后一页.现在,当我点击回来时,它永远不会进入Gap.com主页.

有什么建议...

附加信息:我确实实现了shouldOverrideUrlLoading.如果我删除该方法,它似乎工作正常,但使用此方法它不...

Mat*_*unt 10

我刚刚在软糖上测试了它,它似乎工作.

基本上,每当在WebView中加载新URL时,都要保留URL的副本.

在下一个URL请求中,仔细检查它们我们是否已经在此页面上,如果是,则返回webview历史记录中的另一个步骤.

基本上这是依赖于传递到覆盖步骤的URL是重定向的URL,而不是最终重定向的URL.

public class MainActivity extends Activity {

    private Button mRefreshButton;
    private WebView mWebView;
    private String mCurrentUrl;

    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        setContentView(R.layout.main);

        mWebView = (WebView) findViewById(R.id.webview);
        mRefreshButton = (Button) findViewById(R.id.refresh);

        mRefreshButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 mWebView.reload();
            }
        });

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if(mCurrentUrl != null && url != null && url.equals(mCurrentUrl)) {
                    mWebView.goBack();
                    return true;
                }

                view.loadUrl(url);
                mCurrentUrl = url;
                return true;
            }
        });

        mWebView.loadUrl("http://www.gap.com/");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            switch(keyCode) {
                case KeyEvent.KEYCODE_BACK:
                    if(mWebView.canGoBack()){
                        mWebView.goBack();
                        return true;
                    }
                    break;
            }

        }
        return super.onKeyDown(keyCode, event);
    }
}
Run Code Online (Sandbox Code Playgroud)