2010-10-04 7 views

Odpowiedz

8

Nie bezpośrednio, nie.

Można użyć kombinacji WebViewClient.onPageStarted i WebView.getOriginalUrl aby spróbować ustalić, czy adres URL jest wyświetlacz jest oryginalny jeden wniosek, ale to poWebView postanowił załadować URL. Może to pomóc w ustaleniu, czy nastąpiło przekierowanie, ale nadal nie będzie możliwe odróżnienie zdarzeń użytkownika od wydarzeń skryptowych, które nie powodują przekierowań.

Jeśli kontrolujesz treść strony internetowej, możesz również zakodować adresy URL klikalne przez użytkownika w pewien możliwy do zidentyfikowania sposób (np. Zastrzeżony schemat zamiast http) i wykonać dodatkowe przetwarzanie, które jest wymagane, jeśli kryteria pasują do twoja implementacja shouldOverrideUrlLoading.

10

Właśnie znalazłem coś w tym SDK, które może zadziałać, WebView.getHitTestResult() Daj mi znać, jeśli ktoś zauważy jakieś błędy w tej metodzie.

Oto przykład jak używam go:

public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if(view.getHitTestResult().getType() > 0){ 
     // From a user click, handle it yourself. 
     return true; 
    } else { 
     // Nothing clicked, assumed to be a redirect, let it redirect. 
     return false; 
    } 
} 
+1

Użytkownik klikając na link z wbudowanym kodem JavaScript wydaje się zwracać 0 (nieznany), który nie przejdzie tego testu - przynajmniej w przypadku Honeycomb. – Damian

+0

Dokładnie Damian! Masz rację ... nie zawsze rozpoznajesz kliknięcia! – nithinreddy

17

miałem podobny problem. Potrzebowałem otworzyć stronę w WebView w mojej działalności. Jednak, gdy użytkownik kliknął link na stronie, chciałem, aby został otwarty w "nowym oknie", co oznacza aktywność przeglądarki. Stanowił problem, jeśli strona ma przekierowanie. W tym celu wykonałem następujące czynności:

  1. Wyświetlam tylko podgląd strony internetowej po zakończeniu ładowania strony.
  2. Utrzymuję wartość logiczną, informującą o zakończeniu ładowania strony. Interakcja użytkownika może nastąpić dopiero po zakończeniu ładowania strony. w przeciwnym razie jest to przekierowanie i powinno być otwarte w moim akcjach.

przykładowy kod:

private boolean mLoaded = false; 

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if(mLoaded){ // open in new browser window only if page already finished 
     try 
     { 
      Uri uri = Uri.parse(url); 
      Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
      activity.startActivity(intent); 
     } 
     catch (Exception e) 
     { 
      Logger.log(e); 
     } 
    } 
    return true; 
} 

@Override 
public void onPageFinished(WebView webView, String url) { 
     layoutHoldingTheWebView.setVisibility(View.VISIBLE); 
     mLoaded = true; 
    } 
} 
+0

Dobry pomysł jako taki, ale prawdopodobnie bezużyteczny dla PO. – Behnam

-1

Można to zrobić następująco:

@Override 
public boolean shouldOverrideUrlLoading(WebView webView, String url) { 
    if (webView.getUrl() != null && webView.getOriginalUrl() != null && webView.getOriginalUrl().equalsIgnoreCase(webView.getUrl()) { 
     // Not Redirect 
    } else { 
     // Redirect 
    } 
} 
+0

Użytkownik klikający łącze pojawi się jako przekierowanie w tym przykładzie kodu. – cottonBallPaws

1

zaadaptowany z odpowiedzią Garretta, bo okazało się, że nie do końca pracy, jak napisane, dał kilka błędów itp I część dotycząca widoczności jest moim zdaniem niepotrzebna. Miałem dokładnie ten sam problem jak PO, a to daje zachowanie chcę:

webView.setWebViewClient(new WebViewClient() 
    { 
     private boolean mLoaded = false; 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      if(mLoaded){ // open in new browser window only if page already finished 
       try 
       { 
        Uri uri = Uri.parse(url); 
        Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
        view.getContext().startActivity(intent); 
       } 
       catch (Exception e) 
       { 
        Log.d("webview", e.getMessage()); 
       } 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     @Override 
     public void onPageFinished(WebView webView, String url) 
     { 
      mLoaded = true; 
     } 
    } 
1

W SDK 24. można uzyskać wynik w nowej shouldOverrideUrlLoading(WebView view, WebResourceRequest request),

istnieje metoda isRedirect() w WebResourceRequest która określa, czy żądanie było wynikiem przekierowania po stronie serwera.

Powiązane problemy