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.jar
中android.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" />
//...
更新后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.jar
中android.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" />
//...