提要:
在一个空页面上使用WebView加载Url(这里以【Bing】为例),当点击站点上的链接时,实现自动在外部浏览器打开
下面是代码:
- 创建一个布局文件:
HistoryView.xml
<?xml version="1.0" encoding="utf-8"?>
<WebView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/history_webView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
- 创建一个Activity文件:
HistoryActivity.cs
using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Webkit;
using XAndroid_Demo_2020122101.Utils;
namespace XAndroid_Demo_2020122101
{
[Activity(Label = "HistoryActivity")]
public class HistoryActivity : Activity
{
WebView history_WebView;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.HistoryView);
history_WebView = FindViewById<WebView>(Resource.Id.history_webView);
var bingUrl = "https://cn.bing.com/";
//一定要允许加载JS
history_WebView.Settings.JavaScriptEnabled = true;
history_WebView.SetWebViewClient(new CommonWebViewClient(this));
history_WebView.LoadUrl(bingUrl);
}
//对Android返回键的处理
public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
{
if(keyCode==Keycode.Back && history_WebView.CanGoBack())
{
history_WebView.GoBack();
return true;
}
return base.OnKeyDown(keyCode, e);
}
}
}
- 创建处理文件:
CommonWebViewClient.cs
using System;
using Android.Annotation;
using Android.App;
using Android.Content;
using Android.Webkit;
namespace XAndroid_Demo_2020122101.Utils
{
public class CommonWebViewClient : WebViewClient
{
/// <summary>
/// 加载WebView时显示的进度对话框
/// </summary>
private ProgressDialog progressDialog;
/// <summary>
/// 在加载对话框中显示的消息
/// </summary>
public string LoadingMessage { get; set; }
/// <summary>
/// WebView开始加载时调用的方法
/// </summary>
public event EventHandler<EventArgs> OnLoadStarted;
/// <summary>
/// WebView完成加载时调用的方法
/// </summary>
public event EventHandler<ErrorEventArgs> OnLoadFinished;
private Context context;
/// <summary>
/// 是否发生错误
/// </summary>
private bool isErrorOccurred = false;
[Obsolete]
public CommonWebViewClient(Context context)
{
this.context = context;
progressDialog = new ProgressDialog(context);
progressDialog.SetProgressStyle(ProgressDialogStyle.Spinner);
progressDialog.SetCancelable(false);
}
/// <summary>
/// WebView开始加载时调用的方法
/// </summary>
/// <param name="view">View.</param>
/// <param name="url">URL.</param>
/// <param name="favicon">Favicon.</param>
public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
{
if (!progressDialog.IsShowing)
{
if (LoadingMessage != null)
{
progressDialog.SetMessage(LoadingMessage);
progressDialog.Show();
}
}
if (OnLoadStarted != null)
{
OnLoadStarted(view, null);
}
base.OnPageStarted(view, url, favicon);
}
/// <summary>
/// WebView完成加载时调用的方法
/// </summary>
/// <param name="view">View.</param>
/// <param name="url">URL.</param>
public override void OnPageFinished(WebView view, string url)
{
progressDialog.Dismiss();
if (OnLoadFinished != null)
{
ErrorEventArgs args = new ErrorEventArgs();
args.IsErrorOccurred = isErrorOccurred;
isErrorOccurred = false;
OnLoadFinished(view, args);
}
base.OnPageFinished(view, url);
}
/// <summary>
/// 发生错误时调用的方法
/// </summary>
/// <param name="view">View.</param>
/// <param name="errorCode">Error code.</param>
/// <param name="description">Description.</param>
/// <param name="failingUrl">Failing URL.</param>
[Obsolete]
public override void OnReceivedError(WebView view, ClientError errorCode, string description, string failingUrl)
{
isErrorOccurred = true;
base.OnReceivedError(view, errorCode, description, failingUrl);
}
//API21以前的版本
[Obsolete]
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
return handleUrlHook(view, url);
}
[TargetApi(Value = (int)Android.OS.BuildVersionCodes.N)]
//此方法会拦截所有request
public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
{
return handleUrlHook(view, request.Url.ToString());
}
/// <summary>
/// 当WebView加载新URL(例如链接点击)时调用
/// </summary>
private bool handleUrlHook(WebView view, string url)
{
Intent intent;
if ((url.StartsWith("http:") || url.StartsWith("https:")))
{
Android.Net.Uri uri = Android.Net.Uri.Parse(url);
intent = new Intent(Intent.ActionView, uri);
context.StartActivity(intent);
}
return true;
}
}
public class ErrorEventArgs : EventArgs
{
/// <summary>
/// 是否发生错误
/// </summary>
/// <value><c>true</c> if this instance is error occurred; otherwise, <c>false</c>.</value>
public bool IsErrorOccurred { get; set; }
}
}