2016-10-31 7 views
0

Ich erstelle eine WebView in meiner Anwendung, wo ich offensichtlich eine Webseite mit einigen HTML-Links anzeigen.Wie abfangen onBackPressed() in WebView?

Aber wenn ich auf einen dieser Links zugreifen und dann auf die Zurück-Taste tippe, gehe ich nicht zur aufrufenden Seite zurück, sondern gehe stattdessen von der WebView.

Ist es möglich, dieses Verhalten zu ändern?

Ich erstelle die WebView wie unten.

public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    Configuration conf = getActivity().getResources().getConfiguration(); 
    String locale = conf.locale.getLanguage(); 

    WebView webView = (WebView) view.findViewById(R.id.wbInfoSiteWebView); 

    progressBar = ProgressDialog.show(getActivity(), site.getMainActivity().getResources().getString(R.string.label_bt_info), getArguments().getString("site_name")); 

    webView.setWebViewClient(new WebViewClient() { 

     public void onPageFinished(WebView view, String url) { 
      Log.i(Constants.APP_TAG, "Finished loading URL: " +url); 
      if (progressBar.isShowing()) { 
       progressBar.dismiss(); 
      } 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      Intent intent; 

      if(url.startsWith("tel:")) { 
       intent = new Intent(Intent.ACTION_DIAL); 
       intent.setData(Uri.parse(url)); 
       startActivity(intent); 
       return true; 

      } else if (url.startsWith("http://maps")) { //http://maps.google.fr/maps?f=q&q=45.772962,4.856504 

       String location = null; 

       try { 
        location = "geo:" + url.substring(url.indexOf("&q=") + 3) + "?q=" + url.substring(url.indexOf("&q=") + 3) + " (" + URLEncoder.encode(getArguments().getString("site_name"), "UTF-8") + ")"; 
       } catch (UnsupportedEncodingException e) { 
        location = "geo:" + url.substring(url.indexOf("&q=") + 3) + "?q=" + url.substring(url.indexOf("&q=") + 3); 
       } 

       intent = new Intent(Intent.ACTION_VIEW); 
       intent.setData(Uri.parse(location)); 
       startActivity(intent); 
       return true; 

      } else if (url.startsWith("intent://")) { 

       MainActivity.intentParams = url.substring(0, url.indexOf("#")); 

       getActivity().getFragmentManager().popBackStackImmediate("Fragment_mainmap", 0); 

       return false; 
      } 

      return super.shouldOverrideUrlLoading(view, url); 
     } 

    }); 

    String url = null; 
    url = site.get2ndGuideSiteInfosSvce() + "?language=" + locale + "&site_id=" + site_id.toString(); 

    webView.loadUrl(url); 

    webView.getSettings().setJavaScriptEnabled(true); 

} 

Antwort

2

Sie könnten eine Methode in Ihrer Fragment, so etwas wie folgt definieren:

public boolean goBack() { 
    if (webView.canGoBack()) { 
     webView.goBack(); 
     return true; 
    } 
    return false; 
} 

Und außer Kraft setzen onBackPressed() in Ihrem Activity:

@Override 
public void onBackPressed() { 
    YourFragment fragment = (YourFragment) getSupportFragmentManager() 
      .findFragmentByTag("yourFragmentTag"); 

    if (fragment == null || !fragment.goBack()) { 
     super.onBackPressed(); 
    } 
} 

Wenn Sie möchten, dass die Standard-zurück wegzulassen Button Verhalten insgesamt, sollte die letzte if Anweisung in etwa so aussehen:

if (fragment != null) { 
    fragment.goBack(); 
} 

Und goBack() müsste nichts zurück:

public void goBack() { 
    if (webView.canGoBack()) { 
     webView.goBack(); 
    } 
} 
+0

Sorry für die späte Antwort. Ihre Lösung funktioniert perfekt. sehr viel. – 2ndGAB

+0

Sie sind fantastisch.gespeichert mich –

0

Dies ist die Methode in der android developer training guide verwendet:

@Override 
public void onBackPressed() { 
    if (mWebView.canGoBack()) { 
     mWebView.goBack(); 
     return; 
    } 

    // Otherwise defer to system default behavior. 
    super.onBackPressed(); 
}