Android自定义字体无法以编程方式运行

时间:2018-03-07 18:22:45

标签: android fonts android-fonts

我需要将应用程序的字体更改为自定义字体。我为此使用了Android Native Fonts。我在字体文件夹中添加了my_font.ttf和my_font_italic.ttf。

另外,我创建了这个字体系列资源

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto">
    <font
        android:fontStyle="normal"
        android:font="@font/my_font"
        app:fontStyle="normal"
        app:font="@font/my_font"/>

    <font
        android:fontStyle="italic"
        android:font="@font/my_font_italic"
        app:fontStyle="italic"
        app:font="@font/my_font_italic"/>
</font-family>

在我的布局上,我有一个带有几个TextView的LinearLayout:

<LinearLayout
    android:id="@+id/test"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:textAppearance="@style/text_28_italic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/my_font"
        android:text="Test Text"/>

    <TextView
        android:textAppearance="@style/text_28_bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/my_font"
        android:text="Test Text"/>
</LinearLayout>

我使用的样式是:

<style name="text_28_italic">
    <item name="android:fontFamily">@font/my_font</item>
    <item name="android:textSize">28sp</item>
    <item name="android:textStyle">italic</item>
</style>

<style name="text_28_bold">
    <item name="android:fontFamily">@font/my_font</item>
    <item name="android:textSize">28sp</item>
    <item name="android:textStyle">bold</item>
</style>

如果我测试应用程序,文本视图中的字体会正确显示。

但是,当我尝试按代码添加TextView时,会出现问题。根据{{​​3}},我需要使用Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);按代码设置字体。但我也需要设置一种风格,所以我也使用setTextAppearance()

这是我的代码:

TextView tv1 = new TextView(this);
tv1.setText("Test text");
tv1.setTypeface(ResourcesCompat.getFont(this, R.font.my_font));
tv1.setTextAppearance(this, R.style.text_28_italic);
((LinearLayout) findViewById(R.id.test)).addView(tv1);

TextView tv2 = new TextView(this);
tv2.setText("Test text")
tv2.setTextAppearance(this, R.style.text_28_bold);
tv2.setTypeface(ResourcesCompat.getFont(this, R.font.my_font));
((LinearLayout) findViewById(R.id.test)).addView(tv2);

这样,我无法使其发挥作用。我得到了应用的字体,但不是文本外观。

如何以编程方式使文本外观和字体工​​作?

谢谢!

3 个答案:

答案 0 :(得分:1)

Typeface typeface = ResourcesCompat.getFont(this, R.font.roboto);

.............或........................

Typeface typeface = getResources.getFont(R.font.roboto);
textView.setTypeface(typeface);

答案 1 :(得分:0)

将.ttf字体复制到资产文件夹。然后创建字体并将其应用到您的小部件,如下所示。

Typeface tf = Typeface.createFromAsset(getActivity().getAssets(),"YourFontName.ttf"); //you can use your activity name instead of getActivity().
TextView tv = (TextView) getActivity().findViewById(R.id.tv1);
tv.setTypeface(tf);

要在代码下方更改外观使用。

tv.setTextAppearance(this, android.R.style.TextAppearance_Large);
tv.setTypeface(tv.getTypeface(),Typeface.BOLD);

答案 2 :(得分:0)

或者,您可以使用Calligraphy Library通过XML在此应用中设置自定义字体,

<TextView
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    fontPath="fonts/Roboto-Bold.ttf"/>

TextAppearance中的自定义字体

<style name="TextAppearance.FontPath" parent="android:TextAppearance">
    <!-- Custom Attr-->
    <item name="fontPath">fonts/RobotoCondensed-Regular.ttf</item>
</style>

<TextView
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="@style/TextAppearance.FontPath"/>

样式中的自定义字体

<style name="TextViewCustomFont">
    <item name="fontPath">fonts/RobotoCondensed-Regular.ttf</item>
</style>

在主题中定义的自定义字体

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>

<style name="AppTheme.Widget"/>

<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
    <item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>