2011-08-10 22 views
9

Mam pytanie na stronie internetowej systemu Android.Android WebView - nawigacja po przekierowaniu adresu URL

Załóżmy url przekierowuje do adresu URL B.

Moja aplikacja Android, gdy próbuje otworzyć url, WebView automatycznie przekierowuje do adresu URL B.

Jeśli adres URL jest przekierowany do innego adresu URL, I zobacz oba te adresy URL są przechowywane w historii przeglądania sieci. Teraz moja historia oglądania składa się z [,, URL A, URL B]

Po kliknięciu klawisza powrotu ze strony URL B, przeglądarka internetowa spróbuje załadować URL A, który ponownie przekierowuje do adresu URL B. Musimy dwukrotnie kliknąć klawisz powrotu aby powrócić poza adres URL A

Jak rozwiązać ten problem? Walcząc z ostatnich 2 godzin :(

+0

http://stackoverflow.com/questions/11992478/dead-loop-in-android-webview-backkey-for-redirect-href-link Pomoże to –

Odpowiedz

0

spróbować przeciążyć OnBackPressed(), aby overide tryb standardowy dysk kluczyk działania. Tam u może zakończyć bieżącą działalność lub kontrolować w jaki sposób chcesz.

+0

Nie dostaniesz. Jak mogę się dowiedzieć, czy adres URL jest przekierowanym adresem URL, czy zwykłym adresem URL? Czy możliwe jest usunięcie adresu URL konkretnego elementu z historii przeglądania sieci? – Kumar

4
private class HelloWebViewClient extends WebViewClient { 
} 

mWebView.setWebViewClient(new HelloWebViewClient()); 

Jeśli nadrzędnymi shouldOverrideUrlLoading(), a następnie return false. może nie być prawidłowy sposób, ale to działa na mnie.

+2

To powinna być zaakceptowana odpowiedź. Zwracanie wartości true przy opcji shouldOverrideUrlLoading() jest tym, co wywołuje problem w pierwszej kolejności, ponieważ interfejs API widzi, że jako jawne obciążenie URL, które jest dodawane do tylnego stosu, nie jest traktowane jako zwykłe przekierowanie (które nie jest dodawane do tylnego stosu). – tinsukE

+0

Zgadzam się, że to powinna być zaakceptowana odpowiedź. Zwrócenie 'false' daje oczekiwane wyniki. https://developer.android.com/reference/android/webkit/WebViewClient.html –

9

mam ten sam problem zbyt, i zorientowali się, jak go rozwiązać. to jak twoja. Kiedy klikam pierwszy link (www.new.a) automatycznie przekierowuje inny link (mobile.n ew.a). Zwykle łącza przekierowują dwa lub trzy, a moje rozwiązanie działa na prawie każdym przekierowaniu. Mam nadzieję, że ta odpowiedź pomoże ci w anniezachowaniu przekierowania linków.

W końcu to rozgryzłem. Potrzebujesz WebViewClient z czterema API. W WebViewClient powinny znajdować się: CurrentOverrideUrlLoading(), onPageStarted(), onPageFinished() i doUpdateVisitedHistory(). Wszystkie potrzebne interfejsy API to interfejs API 1, więc nie martw się.

To działa tak. Możesz użyć innej funkcji niż 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

Używam OnBackPressed() zamiast onKeyUp i to nie działa –

0

mam problem zbyt, teraz już rozwiązał problem.

solution

** Jeśli WebViewClient jest, zwróci true oznacza, że ​​aplikacja obsługuje hosta url, a return false oznacza, że ​​prąd WebView obsługuje URL. **

Powiązane problemy