web-dev-qa-db-ja.com

リダイレクトなしのWebViewバック履歴

Android webviewとバックキーのonKeyDownメソッドを実装しました。(webview.goBack();を実装します)

私の問題は、以下のこの投稿の質問とまったく同じです(回答はありません)

Android WebView履歴/バックスタックを制御する方法?

問題-戻るボタンを押すと、webviewは前のURLを選択しますが、そのURLが実際にリダイレクトされた場合、この悪循環/ループに入ります。 chromeまたはストックブラウザを見ると、リダイレクトに戻らずに正しく処理されます。

これはどのように解決できますか?

例:gap.comにアクセスします。次に、「マイギャップクレジットカード」を選択します。これにより、リダイレクトリンクが開き、最後のページが開きます。クリックして戻ると、Gap.comのホームページに移動しません。

助言がありますか...

追加情報:私はshouldOverrideUrlLoadingを実装しました。そのメソッドを削除すると、正常に機能するように見えますが、このメソッドでは機能しません...

14
jrebecca1

ジェリービーンズでこれをテストしたところ、うまくいくようです。

基本的に、新しいURLがWebViewにロードされるときはいつでも、URLのコピーを保持します。

次のURLリクエストで、まだこのページに表示されていないことを再確認し、表示されている場合は、別の手順でWebビュー履歴に戻ります。

基本的に、これは、最終的なリダイレクトされた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);
    }
}
10
Matt Gaunt

誰かがまだそれを探しているなら、私はこの答えを願っています。私は私のプロジェクトで同様の問題を修正するために探していて、-WebView.HitTestResult-URLをリストにプッシュする-onKeyDownなどを使用するなどの複数のアプローチを試しました...私アプリがWebビューだけで構成されていれば、ほとんどが機能すると思います。しかし、私のプロジェクトにはネイティブとWebビューの組み合わせがあり、いくつかのネイティブスキーマを処理します。

基本的に重要なのは、メソッドshouldOverrideUrlLoadingをオーバーライドする方法です。私のアプリがいくつかのURLを処理し、Webビューが他のいくつかのURL、特にバックハンドリングを処理するようにしたかったので、バックプレスにフラグを使用しました。

@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が返されるため、Webビューの動作が模倣されます。同時に、ページの読み込みが完了した後、isBackPressedがfalseに設定されていることを確認します。お役に立てれば !!

2
Anupama VK