14

我为返回键实现了 android webview 和 onKeyDown 方法。(它实现webview.goBack();

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

如何控制 Android WebView 历史/回栈?

问题 - 当我按下后退按钮时,webview选择了前一个 URL,但如果该 URL 实际上是一个重定向,它就会进入这个恶性循环/循环。如果您查看 chrome 或股票浏览器,它会正确处理背面而无需返回重定向。

如何解决?

示例:访问 gap.com。然后选择“我的 Gap 信用卡”。这将打开一个重定向链接,然后是最后一页。现在,当我单击返回时,它永远不会进入 Gap.com 主页。

有什么建议么...

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

4

2 回答 2

11

我刚刚在 jellybean 上对此进行了测试,它似乎有效。

本质上,每当在 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);
    }
}
于 2013-05-28T14:53:12.580 回答
2

如果有人仍在寻找它,我希望这个答案。我一直在寻找解决我项目中的类似问题并尝试了多种方法,例如使用 - WebView.HitTestResult - 将网址推送到列表中 - onKeyDown 等等......我如果您的应用程序仅包含 webview,则认为其中大部分都可以工作。但是我的项目结合了本机和 webview 并处理了一些本机模式。

本质上发现,关键是你如何重写shouldOverrideUrlLoading方法。因为我希望我的应用程序处理一些 url,而 webview 来处理其他一些,尤其是后处理。我使用了一个标志来进行后按,比如 ..

@Override
public void onBackPressed() {
  if (mWebView.canGoBack()) {
    mClient.setIsBackPressed(true);
    //mClient is an instance of the MyWebviewClient
    mWebView.goBack();
  } else {
    super.onBackPressed();
  }
}

public class MyWebviewClient extends WebViewClient {

  private Boolean isBackPressed = false;

  public void setIsBackPressed(Boolean isBackPressed) {
      this.isBackPressed = isBackPressed;
  }

  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
      if (isBackPressed){
          return false;
      }
      else {
          // handle the url by implementing your logic
          return true;
      }
  }

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

这样,当您单击返回时,只要有重定向,它就会返回 false 并因此模拟 webview 的行为。同时,确保在页面加载完成后将 isBackPressed 设置为 false。希望这可以帮助 !!

于 2015-04-27T11:05:48.030 回答