使用特定的font-family设置标签文本

时间:2015-11-17 18:48:54

标签: android xamarin xamarin.android

在我的应用程序中,我需要在选项卡标题上设置自定义字体系列(" sans-serif-condensed-light")。

为了达到我的目的,我使用了StackOverflow上的自定义TabLayout。 这是代码

public sealed class TabLayout : Android.Support.Design.Widget.TabLayout
{   
    public TabLayout (Context context) : base (context)
    {
        Initialize (null);
    }

    public TabLayout (Context context, IAttributeSet attrs) : base (context, attrs)
    {
        Initialize (attrs);
    }

    public TabLayout (Context context, IAttributeSet attrs, int defStyle) : base (context, attrs, defStyle)
    {
        Initialize (attrs);
    }

    Typeface _typeface;
    void Initialize (IAttributeSet attrs)
    {
        _typeface = UiUtils.GetDefaultTypeface (Context);
    }

    public override void AddTab (Tab tab)
    {
        base.AddTab (tab);

        var mainView = (ViewGroup) GetChildAt (0);
        var tabView = (ViewGroup) mainView.GetChildAt (tab.Position);
        var tabViewChild = tabView.GetChildAt (1);
        ((TextView) tabViewChild).SetTypeface(_typeface, TypefaceStyle.Normal);
    }
}

使用此代码一切顺利,但如果我稍后使用以下方式设置标题:

_tabLayout.GetTabAt (1).SetText ("hi");

新的字体系列已丢失。

我尝试以这种方式使用SpannableString:

var _typeface = UiUtils.GetDefaultTypeface (Activity);
            var word2 = new SpannableString (_tabLayout.GetTabAt (1).Text + "a");
            word2.SetSpan (new CustomTypefaceSpan (GetString(Resource.String.default_font_family), _typeface), 0, word2.Length (), SpanTypes.ExclusiveInclusive);
            word2.SetSpan (new ForegroundColorSpan (Resources.GetColor (Resource.Color.textColorPrimary)), 0, 5, SpanTypes.ExclusiveInclusive);

            _tabLayout.GetTabAt (1).SetText (word2);

但是不起作用。

我做错了什么?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我用这种方法解决了我的问题:

    public sealed class TabLayout : Android.Support.Design.Widget.TabLayout
{   
    public TabLayout (Context context) : base (context)
    {
    }

    public TabLayout (Context context, IAttributeSet attrs) : base (context, attrs)
    {
    }

    public TabLayout (Context context, IAttributeSet attrs, int defStyle) : base (context, attrs, defStyle)
    {
    }

    protected override void OnMeasure (int widthMeasureSpec, int heightMeasureSpec)
    {
        base.OnMeasure (widthMeasureSpec, heightMeasureSpec);

        SetTextViewStyle (this);
    }

    static void SetTextViewStyle (ViewGroup parent)
    {
        for (int i = parent.ChildCount - 1; i >= 0; i--) {
            var child = parent.GetChildAt (i);
            if (child is ViewGroup) {
                SetTextViewStyle((ViewGroup) child);
            } else {
                var c = child as TextView;
                if (c != null) 
                {
                    UiUtils.ApplyFont (c);
                    c.SetAllCaps (false);
                    c.Text = c.Text.ToLower ();
                }
            }
        }
    }
}

可能这不是最好的方法,但它确实有效,到现在为止我没有看到性能问题。