Xamarin открыть гиперссылку в нативном webview - PullRequest
0 голосов
/ 15 января 2020

Я занимаюсь разработкой приложения для чата в xamarin.forms. Для моей метки чата я использовал собственную метку, которая могла автоматически обнаруживать HTTP-ссылки. Ссылка, по которой я перешел, HyperLink Label . Это работает хорошо, URL-адреса подсвечиваются и открываются в браузере по умолчанию, но я хотел бы иметь возможность перехватить событие щелчка URL-адреса и открыть вместо него внутренний браузер или веб-просмотр. В настоящее время при щелчке по гиперссылке открываются предложения по выбору других приложений браузера. Я вижу этот похожий вопрос в xamarin.forum . Но я не понял решения. Итак, как я могу открыть гиперссылку во внутреннем браузере или веб-просмотре? Любая помощь приветствуется.

Метка детектора гиперссылки

public class AwesomeHyperLinkLabel : Label
    {

    }

Android Деталь

[assembly: ExportRenderer(typeof(AwesomeHyperLinkLabel), typeof(AwesomeHyperLinkLabelRenderer))]
namespace WhateverYourNamespace
{
    public class AwesomeHyperLinkLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            var view = (AwesomeHyperLinkLabel)Element;
            if (view == null) return;

            TextView textView = new TextView(Forms.Context);
            textView.LayoutParameters = new LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
            textView.SetTextColor(view.TextColor.ToAndroid());

        // Setting the auto link mask to capture all types of link-able data
            textView.AutoLinkMask = MatchOptions.All;
        // Make sure to set text after setting the mask
            textView.Text = view.Text;
            textView.SetTextSize(ComplexUnitType.Dip, (float)view.FontSize);

        // overriding Xamarin Forms Label and replace with our native control
            SetNativeControl(textView);
        }
    }
}

IOS Деталь

[assembly: ExportRenderer(typeof(AwesomeHyperLinkLabel), typeof(AwesomeHyperLinkLabelRenderer))]
namespace WhateverYourNamespace
{
    public class AwesomeHyperLinkLabelRenderer : ViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<View> e)
        {
            base.OnElementChanged(e);

            var view = (AwesomeHyperLinkLabel)Element;
            if (view == null) return;

            UITextView uilabelleftside = new UITextView(new CGRect(0, 0, view.Width, view.Height));
            uilabelleftside.Text = view.Text;
            uilabelleftside.Font = UIFont.SystemFontOfSize((float)view.FontSize);
            uilabelleftside.Editable = false;

        // Setting the data detector types mask to capture all types of link-able data
            uilabelleftside.DataDetectorTypes = UIDataDetectorType.All;
            uilabelleftside.BackgroundColor = UIColor.Clear;

        // overriding Xamarin Forms Label and replace with our native control
            SetNativeControl(uilabelleftside);
        }
    }
}

Мой XAML

<controls:HyperLinkLabel TextColor="White"  Text="www.google.com" HorizontalOptions="Start" />

1 Ответ

1 голос
/ 15 января 2020

Если вы хотите открыть веб в WebView. Вы можете открыть новую страницу содержимого, нажав на ярлык.

await Navigation.PushAsync(new WebContentPage(source));

WebContentPage

<ContentPage.Content>
   <StackLayout VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
     <WebView Source="{Binding source}" />
   </StackLayout>
</ContentPage.Content>
public HtmlWebViewSource source { get; set; }

public WebContentPage(string Websource)
{
  InitializeComponent();

  source = new HtmlWebViewSource() { BaseUrl=Websource};

  BindingContext = this;
}

Обновление

        var urlStr = "12122wwwww.google.com";

        int startIndex=0, endIndex=0;

        if(urlStr.Contains("www."))
        {
            startIndex = urlStr.IndexOf("www.");
        }

        if (urlStr.Contains(".com"))
        {
            endIndex = urlStr.IndexOf(".com")+3;
        }

        if(startIndex != 0&& endIndex!=0)
        {
            var formattedString = new FormattedString();

            Span span1 = new Span() { Text = urlStr.Substring(0,startIndex) , TextColor = Color.Black,FontSize=20};

            formattedString.Spans.Add(span1);

            Span span2 = new Span() { Text = urlStr.Substring(startIndex, endIndex-startIndex+1), TextColor = Color.Blue, FontSize = 20};
            span2.GestureRecognizers.Add(new TapGestureRecognizer() { NumberOfTapsRequired = 1, Command = new Command(() => { }) } );

            formattedString.Spans.Add(span2);

            Span span3 = new Span() { Text = urlStr.Substring(endIndex, urlStr.Length-1-endIndex), TextColor = Color.Black, FontSize = 20};
            formattedString.Spans.Add(span3);

            label.FormattedText = formattedString;
        }

        else
        {
            label.Text = urlStr;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...