Xamarin AppCompat textview自定义

时间:2015-10-01 11:30:34

标签: android xamarin android-actionbar toolbar android-appcompat

更新Android支持Libary v7 AppCompat后 我无法将样式更改为标题和以下内容 不再是wotking:

int myTitleId = Resources.GetIdentifier("action_bar_title", "id", "android");
TextView barTitle = FindViewById<TextView>(myTitleId);
barTitle.SetTypeface(FontFactory.GetMyFont(this), TypefaceStyle.Normal);

2 个答案:

答案 0 :(得分:0)

这是因为AppCompat现在使用ToolBar小部件替代ActionBar。 ToolBar即时为标题创建TextView个实例;如果你深入研究(android.support.v7.widget.)ToolBar代码,你会发现这样的事情:

mTitleTextView = new TextView(context);

(请参阅android.support.v7.widget.ToolBar中的appcompat-v7-23.0.1-sources.jar的第607行)

更重要的是,没有为视图分配id。通过检查视图层次结构也可以很容易地看到这一点:

enter image description here

您看到的TextView是拥有该标题的那个。 id是一个生成的值而不是预定义的(比如ActionBarContainer的那个),这意味着你不能再通过某种静态引用来查找它。

这解释了为什么你的代码按名称进行id-lookup,不再有效:action_bar_title id在这里不再使用了。

有几种解决方案可以让ActionBar标题的自定义字体再次设置。最干净的可能是利用setTitle()占用CharSequence的事实,这意味着您可以附加custom typeface span,使自定义字体和/或样式能够工作。这样做是某种基础&#39; Activity可能最有意义。

当然,你也可以从ToolBar开始迭代本地视图层次结构,但是我说它不太健壮,容易受到未来变化的影响(比如你当前的变化)代码;))。

或者,考虑使用库来简化应用自定义字体的处理。 Calligraphy通常是我的第一站。

答案 1 :(得分:0)

在整合新工具栏之后,这就是我改变风格的方式。

在我的Activity的受保护覆盖​​void OnCreate(Bundle bundle)内部(现在扩展 AppCompatActivity ) 之前有以前的代码,我有:

toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);

var f = toolbar.Class.GetDeclaredField("mTitleTextView");
f.Accessible = true;
var barTitle  = (TextView)f.Get(toolbar);
barTitle.SetTypeface(FontFactory.GetMyFont(this), TypefaceStyle.Normal);

我还需要将其添加到顶部:

using Java.Lang; //for the reflection
using Toolbar =  Android.Support.V7.Widget.Toolbar; 

在layout.axml中我以这种方式包含了toolbar.axml:

//...
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" /> 
//...