【Xamarin.Android】实现简单的WebView案例(持续更新)

提要:
在一个空页面上使用WebView加载Url(这里以【Bing】为例),当点击站点上的链接时,实现自动在外部浏览器打开

下面是代码:

  1. 创建一个布局文件: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>

  1. 创建一个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);
        }
    }
}
  1. 创建处理文件: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; }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值