更新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);
答案 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。通过检查视图层次结构也可以很容易地看到这一点:
您看到的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" />
//...