2011-08-10 13 views
9

Android webviewに関する質問があります。Android WebView - URLリダイレクトをナビゲートする

想定URL AはURL BにリダイレクトURLはいくつかの他のURLにリダイレクトされている場合は、URL Aを開こうと私のアンドロイドアプリケーションは、WebViewのは、自動的にURL B.

にリダイレクト

、I両方のURLがwebviewの履歴に保存されているのを見てください。 Webビューの履歴は、[、、URL A、URL B]

で構成されています。バックキーをクリックしてURL BのWebページをクリックすると、webviewはURL Aをロードしようとしますが、URL Bを再度リダイレクトします。 URLを超えて戻るには

この問題を解決するにはどうすればよいですか?そこuが現在の活動を終了したりしたい方法を制御することができます。デフォルトのハードキーバックアクションをオーバライドする)(OnBackPressedをオーバーロードしてみ過去2時間:(

+0

http://stackoverflow.com/questions/11992478/dead-loop-in-android-webview-backkey-for-redirect-href-linkこれが役立ちます –

答えて

0

から苦労。

+0

あなたを得られませんでした。 URLがリダイレクトされたURLか通常のURLかどうかを知るにはどうすればよいですか?また、WebViewの履歴から特定のURLを削除することは可能ですか? – Kumar

4
private class HelloWebViewClient extends WebViewClient { 
} 

mWebView.setWebViewClient(new HelloWebViewClient()); 

をオーバーライドした場合その後、shouldOverrideUrlLoading()、falseを返す。 は正しい方法ではないかもしれませんが、それは私のために動作します。

+2

これは受け入れられる回答である必要があります。 shouldOverrideUrlLoading()でtrueを返すことは、APIがバックスラックに追加された明示的なURLロードであることをAPIが認識し、共通のリダイレクトとして扱われないためです(バックスタックに追加されません) )。 – tinsukE

+0

私はこれが受け入れられる答えであることに同意します。 'false'を返すと期待される結果が得られます。 https://developer.android.com/reference/android/webkit/WebViewClient.html –

9

私も同じ問題を抱えている、そしてそれを解決する方法を考え出した。それはあなたのようなものだ。私は、最初のリンクを(クリックするとwww.new.a)それは自動的に他のリンクをリダイレクトします(mobile.n ew.a)。通常、リンクは2つまたは3つにリダイレクトされ、私のソリューションはほぼすべてのリダイレクトリンクで処理されています。私は、この回答がリダイレクトリンクを消すことであなたを助けてくれることを願っています。

私はついにそれを理解しました。 4つの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++; 
      } 
     } 
+0

私はonKeyUpの代わりにOnBackPressed()を使用していますが動作しません –

0

私は今、すでに問題を解決し、あまりにも問題を抱えています。

solution

** WebViewClientが提供されている場合は、trueを返す

は、現在のWebViewのURLを扱う意味falseを返しながら、ホストアプリケーションは、URLを処理したことを示します。 **

関連する問題