自定义标签中的Xamarin可点击子字符串

时间:2018-01-28 08:50:20

标签: c# xamarin xamarin.forms xamarin.ios xamarin.android

我正在努力让用户可以点击标签中的某个子字符串并运行一个方法,例如点击 #hashtag 会运行OpenHashtag(string hashtag并点击 @taggedUser 将运行ViewProfile(taggedUser)

我找到了this教程,除了我不希望电话号码或网址可点击,只有主题标签和标记用户。

这些是使用

渲染的

的Android

[assembly: ExportRenderer(typeof(BodyLabel), typeof(BodyLabelAndroid))]
namespace SocialNetwork.Droid.Renderers
{
    public class BodyLabelAndroid : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            var view = (BodyLabel)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(BodyLabel), typeof(BodyLabeliOS))]
namespace SocialNetwork.iOS.Renderers
{
    public class BodyLabeliOS : 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;

            uilabelleftside.DataDetectorTypes = UIDataDetectorType.All;
            uilabelleftside.BackgroundColor = UIColor.Clear;

            SetNativeControl(uilabelleftside);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

机器人:

而不是使用textView.AutoLinkMask = MatchOptions.All 您可以使用 Linkify.AddLinks方法。定义你的正则表达式(例如,任何以#或@开头的单词),它将起作用。

但是在iOS上,我认为它更复杂。 在那里,我看到两个选项:

  1. 使用WebView。解析你的字符串并在需要的地方添加"<a href"
  2. 将文字分成几部分,并为每个可点击部分添加单独的标签。如果您只想单击主题标签和标记用户,可以在文本下方添加适当的标签。之后,您可以添加轻触手势识别器来处理点击。