Xamarin AppCompat 文本视图自定义

Xamarin AppCompat textview custom

更新后Android 支持库 v7 AppCompat 我无法将样式更改为标题和以下内容 不再工作了:

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

那是因为 AppCompat 现在使用 ToolBar 小部件来替代 ActionBar。 ToolBar 为标题 on-the-fly 创建一个 TextView 实例;如果你深入研究 (android.support.v7.widget.)ToolBar 代码,你会发现这样的东西:

mTitleTextView = new TextView(context);

(参考appcompat-v7-23.0.1-sources.jarandroid.support.v7.widget.ToolBar的第607行)

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

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

这就解释了为什么执行 id-lookup-by-name 的代码不再有效:这里不再使用 action_bar_title id。

有几种解决方案可以使为 ActionBar 标题设置自定义字体再次起作用。最干净的可能是利用 setTitle() takes a CharSequence, which means you can attach a custom typeface span 的事实,使自定义字体 and/or 样式起作用。这样做是某种 'base' Activity 可能最有意义。

您当然也可以遍历本地视图层次结构,从 ToolBar 开始,但我想说这不是那么健壮并且容易受到未来更改的影响(比如您当前的代码;)) .

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

集成新工具栏后,我就是这样改变风格的。

在我的 Activity 的 protected override 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" /> 
//...