Xamarin.Android 中带有 MVVMCross 的下划线文本

Underline text in Xamarin.Android witn MVVMCross

我有 Xamarin.Android project 并使用 MVVMCross。我需要在 .axml 布局中添加一些下划线文本。

我找到了一些方法,但它对我不起作用。

我有这样的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<include
    layout="@layout/toolbar" />
<TextView
    android:id="@+id/TextView01"
    android:textSize="16sp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_below="@+id/toolbar"
    local:MvxBind="Text Strings[Text01]" />
<TextView
    android:id="@+id/textLink"
    android:textSize="13sp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:textColor="#1565C0"
    android:layout_below="@id/TextView01"
    local:MvxBind="Text Strings[textLink]; Click MyCommand" />
</RelativeLayout>
  1. 字符串.

    <string name="your_string"><u>Underlined text</u></string>
    

我不能使用这种方式,因为我使用两种语言并且文件夹 Locales 有两个 .txt 文件。所以该项目不会从 strings.xml

中获取字符串
  1. 绘画。

        TextView MyLink = FindViewById<TextView>(Resource.Id.MyLink);
        MyLink.PaintFlags = (MyLink.PaintFlags | Android.Graphics.PaintFlags.UnderlineText);
    
  2. FromHtml.

    txtView.setText(Html.fromHtml("<u>underlined</u> text"));
    

对我不起作用,此外我看到绿色下划线并评论说这个决定已被弃用。

如何将我的 TextView 标记为带下划线?

创建自己的 textView 并使用它代替 xml 中的标准 textView

public class UnderlineTextView : TextView

private void Initialize()
{
    //this.PaintFlags = this.PaintFlags | Android.Graphics.PaintFlags.UnderlineText;
    //this.Text = "This text will be underlined";

    String underlineData = this.Text;
    SpannableString content = new SpannableString(underlineData);
    content.SetSpan(new UnderlineSpan(), 0, underlineData.Length, 0);
    // 0 specify start index and underlineData.length() specify end index of styling
    this.TextFormatted = content;
}

选项 2 看起来像 Java 而不是 xamarin c#,尝试:

txtView.PaintFlags = (txtView.PaintFlags | Android.Graphics.PaintFlags.UnderlineText);

并使用正确的 ID。

您应该使用 txtView.TextFormatted = Html.fromHtml("<u>underlined</u> text"); 才能按预期工作。

当您使用 MVVM 模式时,使用数据绑定通常是理想的选择。将数据绑定与 MvvmCross 结合使用的一种方法是使用 ValueConverter 接受字符串输入并输出 SpannableString,您可以将其与 TextFormatted MvvmCross 绑定一起使用。

public class UnderlinedStringValueConverter : MvxValueConverter<string, SpannableString>
{
    protected override SpannableString Convert(string value, Type targetType, object parameter, CultureInfo culture)
    {
        var spannable = new SpannableString(value ?? string.Empty);
        spannable.SetSpan(new UnderlineSpan(), 0, spannable.Length(), 0);
        return spannable;
    }
}

然后在您的 TextView AXML 中:

<TextView
  ....
  local:MvxBind="TextFormatted UnderlinedString(Strings[textLink]);" />