如何在使用AppCompat时更改ActionBar标题字体

时间:2015-01-03 17:13:00

标签: android android-layout android-actionbar android-actionbar-compat android-fonts

我想将自定义字体应用于ActionBar上显示的应用标题。以前我没有使用任何支持库和这个解决方案:

int titleId = getResources().getIdentifier("action_bar_title", "id",
                "android");
TextView yourTextView = (TextView) findViewById(titleId);
yourTextView.setTypeface(face);

对我来说很好。但是现在我使用材质设计SupportActionBar,这会抛出NullPointerException。那么如何在使用AppCompat时更改ActionBar字体?

3 个答案:

答案 0 :(得分:6)

假设您已经成功使用AppCompat v22 +的新工具栏 并且您要在活动中导入android.support.v7.widget.Toolbar。

所以在你的OnCreate上你已经有了

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

此时你差不多完成了:

import java.lang.reflect.field;

并添加以下行:

TextView yourTextView = null;
try {
    Field f = toolbar.getClass().getDeclaredField("mTitleTextView");
    f.setAccessible(true);
    yourTextView = (TextView) f.get(toolbar);
    yourTextView.setTypeface(face);
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
}

答案 1 :(得分:2)

使用工具栏代替ActionBar.follow以下步骤添加工具栏: 1.将您的应用主题更改为Theme.AppCompat.Light.NoActionBar 2.从“文件”菜单中选择项目结构,转到库依赖项,添加设计库并同步项目。 3.将您的布局转到要显示ActionBar的位置并写下代码:

<android.support.v7.widget.Toolbar
    android:id="@+id/mytoolbar"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:background="@color/pccolor"
    android:title="Services"
    app:titleTextAppearance="@style/Toolbar.TitleText"
    android:elevation="4dp">
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Toolbar Title"
    android:layout_gravity="center"
    android:id="@+id/toolbar_title" />
</android.support.v7.widget.Toolbar>

4.在活动中,写如下:

 Toolbar mytoolbar=(Toolbar)findViewById(R.id.mytoolbar);
    setSupportActionBar(mytoolbar);

自定义标题字体:

fontPath = "Fonts/Roboto-Light.ttf";
    Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), fontPath);

TextView tv_ins=(TextView)FindViewById(R.id.toolbar_title);
 tv_ins.setText("mytitle");
tv_ins.setTypeface(tf);

试试这个希望这会对你有所帮助,如果有任何不妥之处请告诉我。

答案 2 :(得分:-2)

准备自定义布局,将文本视图放入action_bar_layout然后调用 actionbar.setcustomlayout()