如何拦截WebView中的onBackPressed()?
How to intercept onBackPressed() in WebView?
我在我的应用程序中创建了一个 WebView
,我显然在其中显示了一个带有一些 HTML 链接的网页。
但是当我访问其中一个链接然后点击返回键时,我没有 return 到调用页面而是从 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);
}
您可以在 Fragment
中定义一个方法,如下所示:
public boolean goBack() {
if (webView.canGoBack()) {
webView.goBack();
return true;
}
return false;
}
并覆盖 Activity
中的 onBackPressed()
:
@Override
public void onBackPressed() {
YourFragment fragment = (YourFragment) getSupportFragmentManager()
.findFragmentByTag("yourFragmentTag");
if (fragment == null || !fragment.goBack()) {
super.onBackPressed();
}
}
如果您想完全忽略默认的后退按钮行为,后面的 if
语句应该如下所示:
if (fragment != null) {
fragment.goBack();
}
并且goBack()
不需要return任何东西:
public void goBack() {
if (webView.canGoBack()) {
webView.goBack();
}
}
这是android developer training guide中使用的方法:
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
return;
}
// Otherwise defer to system default behavior.
super.onBackPressed();
}
我在我的应用程序中创建了一个 WebView
,我显然在其中显示了一个带有一些 HTML 链接的网页。
但是当我访问其中一个链接然后点击返回键时,我没有 return 到调用页面而是从 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);
}
您可以在 Fragment
中定义一个方法,如下所示:
public boolean goBack() {
if (webView.canGoBack()) {
webView.goBack();
return true;
}
return false;
}
并覆盖 Activity
中的 onBackPressed()
:
@Override
public void onBackPressed() {
YourFragment fragment = (YourFragment) getSupportFragmentManager()
.findFragmentByTag("yourFragmentTag");
if (fragment == null || !fragment.goBack()) {
super.onBackPressed();
}
}
如果您想完全忽略默认的后退按钮行为,后面的 if
语句应该如下所示:
if (fragment != null) {
fragment.goBack();
}
并且goBack()
不需要return任何东西:
public void goBack() {
if (webView.canGoBack()) {
webView.goBack();
}
}
这是android developer training guide中使用的方法:
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
return;
}
// Otherwise defer to system default behavior.
super.onBackPressed();
}