在我的应用程序中,我需要在选项卡标题上设置自定义字体系列(" 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);
但是不起作用。
我做错了什么?
非常感谢!
答案 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 ();
}
}
}
}
}
可能这不是最好的方法,但它确实有效,到现在为止我没有看到性能问题。