【问题标题】:Xamarin clickable substring in custom label自定义标签中的 Xamarin 可点击子字符串
【发布时间】:2018-01-28 21:29:08
【问题描述】:

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

我找到了 this 教程,但我不希望电话号码或 URL 可点击,只希望标签和标记的用户。

这些是它使用的渲染

安卓

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

【问题讨论】:

  • 您将无法使用这些解决方案(至少就 Andriod 而言)。他们启用的安卓功能来自developer.xamarin.com/api/type/Android.Text.Util.MatchOptions,显然它们不支持哈希标签,你必须制作一个非常具体的渲染器,我猜这不会是微不足道的(但可能),或者找到一个你可以适应的预制解决方案更细粒度的方法
  • 最好的方法是在标签上添加手势识别器。我不太清楚你为什么选择自定义渲染器,但我看到你用 xamarin.forms 标记了这个问题。如果您已经在 xamarin 表单中构建了解决方案,那么添加一个执行命令的手势识别器将是微不足道的。
  • @SpookKruger 如果我添加了一个手势识别器,它将使整个标签只直接指向那个标签,如果帖子中有两个主题标签或两个标签用户怎么办?

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


【解决方案1】:

安卓:

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

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

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

【讨论】:

  • 如何告诉它点击时运行哪个方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2014-05-08
  • 2017-11-16
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多