xamarin - 在自定义 xamarin 表单 Web View 中设置当前 url

标签 xamarin xamarin.forms xamarin.android

我从 Xamarin.Forms 开始,我想做的只是在自定义 Webview 上设置 CurrentUrl 属性在 Xamarin.Forms 中

换句话说:当调用OnPageFinished方法时,我需要将MyWebViewCurrentUrl属性设置为新的Url。

有人有想法吗?

这是我的主要Webview:

public class MyWebView: Xamarin.Forms.WebView
{

    public static readonly BindableProperty UrlProperty = BindableProperty.Create(
        propertyName: "CurrentUrl",
        returnType: typeof(string),
        declaringType: typeof(MyWebView),
        defaultValue: default(string));

    public string CurrentUrl
    {
        get { return (string)GetValue(UrlProperty); }
        set { SetValue(UrlProperty, value); }
    }
}

这是我在 Project.Droid 中的 Renderer:

[assembly: ExportRenderer(typeof(MyWebView), typeof(MyProject.Droid.WebViewRenderer))]
namespace Manateq.Droid
{
    public class WebViewRenderer : Xamarin.Forms.Platform.Android.WebViewRenderer
    {
        public WebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {

            base.OnElementChanged(e);
            Control.SetWebViewClient(new Callback(Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity));
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            MyWebView myWebView = sender as MyWebView;
            if (e.PropertyName == "CurrentUrl")
            {
            }
        }
    }

    public class Callback : WebViewClient
    {
        Activity _context;
        public Callback(Activity _context)
        {
            this._context = _context;
        }
        public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
        {
            //view.LoadUrl(url);
            Intent i = new Intent(Intent.ActionView, Uri.Parse(url));
            _context.StartActivity(i);
            return true;
        }
        public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
        {
            base.OnPageStarted(view, url, favicon);
            DependencyService.Get<ILoadingIndicator>().Show();
        }
        public override void OnPageFinished(Android.Webkit.WebView view, string url)
        {
            base.OnPageFinished(view, url);
            //element.CurrentUrl = url;
            DependencyService.Get<ILoadingIndicator>().Dismiss();
        }
    }
}

这是我在 xaml 中使用自定义 Web View :

<customControls:MyWebView VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" x:Name="webView"/>

最佳答案

可以通过MyWebView myWebView = e.NewElement as MyWebView; var currentUrl=myWebView.CurrentUrl;获取CurrentUrl的值在OnElementChanged ;然后你可以将该值传递给Callback的构造函数。最后在 OnPageFinished 中设置即可方法 element.CurrentUrl = currenturl;就像下面的代码一样。

[assembly: ExportRenderer(typeof(MyWebView), typeof(WebViewRenderer))]
namespace WebviewDemo.Droid
{
    public class WebViewRenderer : Xamarin.Forms.Platform.Android.WebViewRenderer
    {
        public WebViewRenderer(Context context) : base(context)
        {
        }
        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
           
            base.OnElementChanged(e);
          
            MyWebView myWebView = e.NewElement as MyWebView;
            var currentUrl=myWebView.CurrentUrl;
            Control.SetWebViewClient(new Callback(Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity, currentUrl));
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            MyWebView myWebView = sender as MyWebView;
            if (e.PropertyName == "CurrentUrl")
            {
            }
        }
    }

    public class Callback : WebViewClient
    {
        Activity _context;
        string currenturl;
        public Callback(Activity _context,string currenturl)
        {
            this._context = _context;
            this.currenturl = currenturl;
        }
        public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
        {
            //view.LoadUrl(url);
            Intent i = new Intent(Intent.ActionView, Uri.Parse(url));
            _context.StartActivity(i);
            return true;
        }
        public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
        {
            base.OnPageStarted(view, url, favicon);
            DependencyService.Get<ILoadingIndicator>().Show();
        }
        public override void OnPageFinished(Android.Webkit.WebView view, string url)
        {
            base.OnPageFinished(view, url);
            element.CurrentUrl = currenturl;
            DependencyService.Get<ILoadingIndicator>().Dismiss();
        }
    }
}

你想达到这个GIF的效果吗?

enter image description here

如果是这样,您可以在OnPageFinished中加载当前url方法。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Webkit;
using Android.Widget;
using WebviewDemo;
using WebviewDemo.Droid;
using Xamarin.Forms;

[assembly: ExportRenderer(typeof(MyWebView), typeof(WebViewRenderer))]
namespace WebviewDemo.Droid
{
    public class WebViewRenderer : Xamarin.Forms.Platform.Android.WebViewRenderer
    {
        public WebViewRenderer(Context context) : base(context)
        {
        }
        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
           
            base.OnElementChanged(e);
          
            MyWebView myWebView = e.NewElement as MyWebView;
            var currentUrl=myWebView.CurrentUrl;
            Control.SetWebViewClient(new Callback(Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity, currentUrl));
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            MyWebView myWebView = sender as MyWebView;
            if (e.PropertyName == "CurrentUrl")
            {

            }
        }
    }

    public class Callback : WebViewClient
    {
        Activity _context;
        string currenturl;
        
        public Callback(Activity _context,string currenturl)
        {
            this._context = _context;
            this.currenturl = currenturl;
        }


        public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
        {
            //if (!loadingFinished)
            //{
            //    redirect = true;
            //}

            //loadingFinished = false;
            //view.LoadUrl(currenturl);
            //Console.WriteLine("Loading web view...");
            return true;
        }

        public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
        {
            base.OnPageStarted(view, url, favicon);
           
        }

        public override void OnPageFinished(Android.Webkit.WebView view, string url)
        {
            
            if (url.Equals("https://www.google.com/"))
            {
                view.LoadUrl(currenturl);
            }
           
        }

        //public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
        //{
        //    //view.LoadUrl(url);

        //    //   Intent i = new Intent(Intent.ActionView, Uri.Parse(url));
        //    //  _context.StartActivity(i);

        //    view.LoadUrl(url);
        //    isRedirected = true;
        //    return true;
        //}

        //public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
        //{
        //    base.OnPageStarted(view, url, favicon);

        //    if (!isRedirected)
        //    {
        //        //Do something you want when starts loading
        //    }

        //    isRedirected = false;
        //    // DependencyService.Get<ILoadingIndicator>().Show();
        //}
        //public override void OnPageFinished(Android.Webkit.WebView view, string url)
        //{
        //    base.OnPageFinished(view, url);
        //    if (!isRedirected)
        //    {
        //        //Do something you want when finished loading 
               
        //    }
           
        //   // element.CurrentUrl = currenturl;
        //  //  DependencyService.Get<ILoadingIndicator>().Dismiss();
        //}
    }
}

在 xaml 中。您可以绑定(bind)CurrentUrl的值,或者直接设置它。

 <customControls:MyWebView VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" x:Name="webView"/>

Xaml背景代码。

 public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
               webView.Source = "https://www.google.com";
             webView.CurrentUrl = "https://www.baidu.com";
        }
    }

关于xamarin - 在自定义 xamarin 表单 Web View 中设置当前 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63390495/

相关文章:

android - 日历事件未显示在日历中

c# - 如何在MugenMvvm中获取与 View 模型相关的 View

xamarin.forms - UWP - 无法解析程序集或 Windows 元数据文件

c# - 直接下载mp3文件

android - Android 增强现实入门

Android MapFragment 调整大小动画断断续续/滞后

android - Xamarin Razor WebView 模板缺少引用

ios - 当设置为 "Link All"时,DependencyService.Get 返回 null

自上次使用相同代码构建以来,Xamarin iOS 应用程序大小增加了 60%

xaml - Xamarin Forms,我想触摸输入字段,其中的文本很干净