Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在自定义xamarin表单web视图中设置当前url_Xamarin_Xamarin.forms_Xamarin.android - Fatal编程技术网

在自定义xamarin表单web视图中设置当前url

在自定义xamarin表单web视图中设置当前url,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我从Xamarin.Forms开始,我试图做的只是在Xamarin.Forms中的自定义Webview上设置一个CurrentUrl属性 换句话说:当调用OnPageFinished方法时,我需要将MyWebView的CurrentUrl属性设置为新的Url 有人有主意吗 这是我的主要Webview: public class MyWebView: Xamarin.Forms.WebView { public static readonly BindableProperty UrlPr

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

换句话说:当调用
OnPageFinished
方法时,我需要将
MyWebView
CurrentUrl
属性设置为新的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); }
    }
}
这是我在
项目中的
渲染器
。Droid

[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();
        }
    }
}

您可以通过MyWebView MyWebView=e.NewElement作为MyWebView获取CurrentUrl的值;var currentUrl=myWebView.currentUrl
OnElementChanged
中;然后您可以将该值传输到回调函数的构造函数。最后,您可以在
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();
        }
    }
}
在xaml中。您可以绑定CurrentUrl的值,也可以直接设置它

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

Leon
提供的答案很好。但我找到了一个更简单的方法。这就是我所做的

在扩展
WebviewClient
Callback
类中,我将
OnPageStarted
OnPageFinished
编辑为:

public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
{
    DependencyService.Get<ILoadingIndicator>().Show();
    base.OnPageStarted(view, url, favicon);
    var args = new WebNavigatingEventArgs(WebNavigationEvent.NewPage, new UrlWebViewSource { Url = url }, url);
    _renderer.ElementController.SendNavigating(args);
}
public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
    DependencyService.Get<ILoadingIndicator>().Dismiss();
    base.OnPageFinished(view, url);
    var source = new UrlWebViewSource { Url = url };
    var args = new WebNavigatedEventArgs(WebNavigationEvent.NewPage, source, url, WebNavigationResult.Success);
    _renderer.ElementController.SendNavigated(args);
}
public override void OnPageStarted(Android.Webkit.WebView视图,字符串url,Android.Graphics.Bitmap favicon)
{
DependencyService.Get().Show();
base.OnPageStarted(视图、url、favicon);
var args=new-webnavigationeventargs(WebNavigationEvent.NewPage,new-UrlWebViewSource{Url=Url},Url);
_renderer.ElementController.SendNavigating(args);
}
public override void OnPageFinished(Android.Webkit.WebView视图,字符串url)
{
DependencyService.Get().disclose();
base.OnPageFinished(视图、url);
var source=newurlwebviewsource{Url=Url};
var args=new webnavigationedeventargs(WebNavigationEvent.NewPage,source,url,WebNavigationResult.Success);
_renderer.ElementController.SendNavigated(args);
}
至于
\u呈现的
its:
ElementController=>元素WebViewRenderer
类中


添加这些代码行时,
Navigated
事件被正常命中。因此,当发生这种情况时,我们可以简单地使用
url
参数,该参数存在于
Navigated
事件中。

但是如何在
element.CurrentUrl=CurrentUrl?还有一件事,我想一些绑定需要添加到
xaml
文件中,对吗?为了绑定
Webview
url@MohamadMousheimish我更新我的答案,你可以参考。谢谢你的分享,请接受你的答案,这将帮助其他有类似问题的人。
 <customControls:MyWebView VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" x:Name="webView"/>
 public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
               webView.Source = "https://www.google.com";
             webView.CurrentUrl = "https://www.baidu.com";
        }
    }
public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
{
    DependencyService.Get<ILoadingIndicator>().Show();
    base.OnPageStarted(view, url, favicon);
    var args = new WebNavigatingEventArgs(WebNavigationEvent.NewPage, new UrlWebViewSource { Url = url }, url);
    _renderer.ElementController.SendNavigating(args);
}
public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
    DependencyService.Get<ILoadingIndicator>().Dismiss();
    base.OnPageFinished(view, url);
    var source = new UrlWebViewSource { Url = url };
    var args = new WebNavigatedEventArgs(WebNavigationEvent.NewPage, source, url, WebNavigationResult.Success);
    _renderer.ElementController.SendNavigated(args);
}