2016-10-31 4 views
0

Я создаю WebView в своем приложении, где я, очевидно, показываю веб-страницу с некоторыми ссылками HTML.Как перехватить onBackPressed() в WebView?

Но когда я получаю доступ к одной из этих ссылок, а затем нажмите на клавишу «Назад», я не вернусь на вызывающую страницу, а выйду из WebView.

Можно ли изменить это поведение?

Я создаю WebView, как показано ниже.

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); 

} 

ответ

2

Вы можете определить метод в Fragment, что-то вроде этого:

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

И переопределить onBackPressed() в вашем Activity:

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

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

Если вы хотите, чтобы пропустить по умолчанию обратно в целом, последнее утверждение if должно выглядеть примерно так:

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

И goBack() не будет ничего возвращать:

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

Извините за поздний ответ. Ваше решение отлично работает. очень много. – 2ndGAB

+0

вы awesome.saved me –

0

Это метод, используемый в android developer training guide:

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

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