Android -使用自定义字体

我对TextView应用了自定义字体,但它似乎没有改变字体。

这是我的代码:

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(myTypeface);

谁能帮我摆脱这个问题?

254167 次浏览

我以前成功地使用过这个方法。我们的实现之间的唯一区别是,我没有在资产中使用子文件夹。但不确定这是否会改变什么。

在Mobiletuts+上有一个关于Android文本格式的很好的教程。快速提示:自定义Android字体

编辑:现在我自己测试了一下。这是解决方案。你可以使用名为fonts的子文件夹,但它必须在assets文件夹中,而不是res文件夹中。所以

资产/字体

还要确保字体结尾。我是说字体文件本身的结尾都是小写。换句话说,它不应该是myFont.TTF,而是myfont.ttf 这条路必须小写

确保将上面的代码粘贴到onCreate() 你对super的调用和对setContentView()的调用。这个小细节让我挂念了一会儿。

我也遇到了同样的问题,TTF没有出现。我改变了字体文件,与相同的代码,它的工作。

如果你想从网络加载字体或轻松地设置它的样式,你可以使用:

https://github.com/shellum/fontView

例子:

<!--Layout-->
<com.finalhack.fontview.FontView
android:id="@+id/someFontIcon"
android:layout_width="80dp"
android:layout_height="80dp" />


//Java:
fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE);
fontView.addForegroundColor(Color.RED);
fontView.addBackgroundColor(Color.WHITE);

你可以在https://github.com/neopixl/PixlUI使用PixlUI

导入他们的.jar并在XML中使用它

 <com.neopixl.pixlui.components.textview.TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
pixlui:typeface="GearedSlab.ttf" />

如果你把字体放在正确的地方,字体文件本身没有错误,你的代码应该像那样工作,RATTLESNAKE。

然而,如果你能在你的布局xml中定义一种字体,就会容易得多,就像这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >


<!-- This text view is styled with the app theme -->
<com.innovattic.font.FontTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This uses my font in bold italic style" />


<!-- This text view is styled here and overrides the app theme -->
<com.innovattic.font.FontTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:flFont="anotherFont"
android:textStyle="normal"
android:text="This uses another font in normal style" />


<!-- This text view is styled with a style and overrides the app theme -->
<com.innovattic.font.FontTextView
style="@style/StylishFont"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This also uses another font in normal style" />


</LinearLayout>

附带的res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">


<!-- Application theme -->
<!-- Use a different parent if you don't want Holo Light -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>


<!-- Style to use for ALL text views (including FontTextView) -->
<!-- Use a different parent if you don't want Holo Light -->
<style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView">
<item name="android:textAppearance">@style/MyTextAppearance</item>
</style>


<!-- Text appearance to use for ALL text views (including FontTextView) -->
<!-- Use a different parent if you don't want Holo Light -->
<style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo">
<!-- Alternatively, reference this font with the name "aspergit" -->
<!-- Note that only our own TextView's will use the font attribute -->
<item name="flFont">someFont</item>
<item name="android:textStyle">bold|italic</item>
</style>


<!-- Alternative style, maybe for some other widget -->
<style name="StylishFont">
<item name="flFont">anotherFont</item>
<item name="android:textStyle">normal</item>
</style>


</resources>

为此,我专门创建了几个工具。参考GitHub上的这个项目,或者看看这个解释了整个事情的博客

在尝试了本线程中描述的大多数解决方案后,我意外地发现了Calligraphy (https://github.com/chrisjenx/Calligraphy) - Christopher Jenkins的一个库,可以让你轻松地向应用程序添加自定义字体。与这里建议的方法相比,他的库的优点是:

  1. 你不必引入自己的重载TextView组件,你使用内置的TextView
  2. 您可以使用gradle轻松地包含该库
  3. 图书馆不限制你的字体选择;您只需将您喜欢的添加到资产目录
  4. 你不仅得到自定义文本视图-所有其他基于文本的Android组件也将显示使用您的自定义字体。

对于android中的自定义字体,在assets文件夹中创建一个文件夹,命名为“Fonts”,将您想要的Fonts .ttf或.otf文件放在其中。

如果你扩展UIBaseFragment:

Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf");
tv.setTypeface(font);

else if扩展活动:

Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf");
tv.setTypeface(font);

我知道已经有了很好的答案,但这里有一个完全工作的实现。

这是自定义文本视图:

package com.mycompany.myapp.widget;


/**
* Text view with a custom font.
* <p/>
* In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts
* that are currently supported are defined in the enum {@link CustomFont}. Remember to also add
* {@code xmlns:customAttrs="http://schemas.android.com/apk/res-auto"} in the header.
*/
public class CustomFontTextView extends TextView {


private static final String sScheme =
"http://schemas.android.com/apk/res-auto";
private static final String sAttribute = "customFont";


static enum CustomFont {
ROBOTO_THIN("fonts/Roboto-Thin.ttf"),
ROBOTO_LIGHT("fonts/Roboto-Light.ttf");


private final String fileName;


CustomFont(String fileName) {
this.fileName = fileName;
}


static CustomFont fromString(String fontName) {
return CustomFont.valueOf(fontName.toUpperCase(Locale.US));
}


public Typeface asTypeface(Context context) {
return Typeface.createFromAsset(context.getAssets(), fileName);
}
}


public CustomFontTextView(Context context, AttributeSet attrs) {
super(context, attrs);


if (isInEditMode()) {
return;
} else {
final String fontName = attrs.getAttributeValue(sScheme, sAttribute);


if (fontName == null) {
throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view");
} else {
final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context);
setTypeface(customTypeface);
}
}
}
}

这里是自定义属性。这应该放到你的res/attrs.xml文件中:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomFontTextView">
<attr name="customFont" format="string"/>
</declare-styleable>
</resources>

下面是你如何使用它。我将使用一个相对布局来包装它并显示customAttr声明,但它显然可以是你已经拥有的任何布局。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:customAttrs="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">


<com.mycompany.myapp.widget.CustomFontTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="foobar"
customAttrs:customFont="roboto_thin" />


</RelativeLayout>

你可以使用easy &简单的EasyFonts第三方库来设置各种自定义字体到你的TextView。通过使用这个库,你应该不必担心下载和添加字体到assets/fonts文件夹。还有关于字体对象的创建。

而不是

Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(myTypeface);

简单:

TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));

这个库还提供了以下字体面。

  • Roboto
  • Droid衬线
  • 机器人机器人
  • 自由
  • 有趣的栽培者
  • Android的国家
  • 绿色的鳄梨
  • 识别

由于我对SO的所有解决方案都不满意,所以我提出了我的解决方案。这是基于标签的一个小技巧(即你不能在你的代码中使用标签),我把字体路径放在那里。所以当定义视图时,你可以这样做:

<TextView
android:id="@+id/textViewHello1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World 1"
android:tag="fonts/Oswald-Regular.ttf"/>

或:

<TextView
android:id="@+id/textViewHello2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World 2"
style="@style/OswaldTextAppearance"/>


<style name="OswaldTextAppearance">
<item name="android:tag">fonts/Oswald-Regular.ttf</item>
<item name="android:textColor">#000000</item>
</style>

现在你可以显式地访问/设置视图如下:

TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah");

或者只是通过:

TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case)

你问的魔法课是什么?主要是从另一个SO帖子中粘来的,为活动和片段提供了helper方法:

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


import java.util.HashMap;
import java.util.Map;


public class TextViewHelper {
private static final Map<String, Typeface> mFontCache = new HashMap<>();


private static Typeface getTypeface(Context context, String fontPath) {
Typeface typeface;
if (mFontCache.containsKey(fontPath)) {
typeface = mFontCache.get(fontPath);
} else {
typeface = Typeface.createFromAsset(context.getAssets(), fontPath);
mFontCache.put(fontPath, typeface);
}
return typeface;
}


public static void setupTextViews(Context context, ViewGroup parent) {
for (int i = parent.getChildCount() - 1; i >= 0; i--) {
final View child = parent.getChildAt(i);
if (child instanceof ViewGroup) {
setupTextViews(context, (ViewGroup) child);
} else {
if (child != null) {
TextViewHelper.setupTextView(context, child);
}
}
}
}


public static void setupTextView(Context context, View view) {
if (view instanceof TextView) {
if (view.getTag() != null) // also inherited from TextView's style
{
TextView textView = (TextView) view;
String fontPath = (String) textView.getTag();
Typeface typeface = getTypeface(context, fontPath);
if (typeface != null) {
textView.setTypeface(typeface);
}
}
}
}


public static TextView setupTextView(View rootView, int id) {
TextView textView = (TextView) rootView.findViewById(id);
setupTextView(rootView.getContext().getApplicationContext(), textView);
return textView;
}


public static TextView setupTextView(Activity activity, int id) {
TextView textView = (TextView) activity.findViewById(id);
setupTextView(activity.getApplicationContext(), textView);
return textView;
}
}

不幸的是,这个问题没有好的解决方案。

我已经看到了许多关于使用自定义TextView的文章,但他们忘记了,它不仅仅是TextView,可以实现字体&有一些textview隐藏在其他视图中,开发者无法访问;我甚至不打算开始Spannable

你可以使用外部字体工具,比如:

书法字体工具

这个循环在应用程序的每个视图上创建,甚至这个实用程序错过了一些视图(ViewPager呈现正常字体),然后你有问题,当谷歌更新他们的构建工具,这将偶尔崩溃,因为它需要目标弃用的属性。它也有点慢,因为它使用Java的反射

这真的是由谷歌来解决的。Android需要更好的字体支持。如果你看看iOS的解决方案,他们实际上有100种字体可供选择。想要自定义字体?简单地丢一个TFF,它是可用的..

目前,我们目前仅限于谷歌提供的服务,这是非常有限的,但幸运的是,移动优化。

在Android O预览版中,最好的方法是这样:

只有当你有android studio-2.4或以上

  1. 右键单击res文件夹,转到新建> Android资源目录。新< br >
  2. .单击“确定”
  3. 在“资源类型”列表中,选择“字体”,然后单击“确定”
  4. 在字体文件夹中添加您的字体文件。下面的文件夹结构生成R.font.dancing_scriptR.font.la_laR.font.ba_ba.
  5. 双击一个字体文件,在编辑器中预览文件的字体。

接下来,我们必须创建一个字体族:

  1. 右键单击字体文件夹并转到新建>字体资源文件。系统弹出“新建资源文件”窗口
  2. 输入文件名,然后单击“确定”。新的字体资源XML在编辑器中打开
  3. 将每个字体文件、样式和权重属性包含在字体标签元素中。下面的XML演示了如何在字体资源XML中添加与字体相关的属性:

    李< / p > < / >

添加字体到TextView:

   <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/hey_fontfamily"/>

从文档来看

Working With Fonts

所有步骤都是正确的。

在API 26的官方文档中描述了这样做的正确方法:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

这包括将ttf文件放在res/font文件夹中,并创建一个字体家族文件。

七年后,你可以通过使用android.support库26++轻松改变整个应用程序textView或任何你想要的东西。

例句:

创建你的字体包应用程序/ src / res /字体,并将你的字体移动到它。

enter image description here

在你的应用主题中添加一个fontFamily:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
. . . ...
<item name="android:fontFamily">@font/demo</item>
</style>

仅用于textView的示例:

<style name="fontTextView" parent="@android:style/Widget.TextView">
<item name="android:fontFamily">monospace</item>
</style>

在你的主题中加入:

<item name="android:textViewStyle">@style/fontTextView</item>

目前它在8.1至4.1 API果冻豆上工作,这是一个广泛的范围。

< >强更新回答: Android 8.0 (API级别26)引入了一个新特性,XML字体。 只要在运行Android 4.1 (API级别16)或更高的设备上使用XML字体功能,使用支持库26。< / p >

请看这个链接


旧的答案

有两种方法来定制字体:

< p > ! !自定义字体 资产/字体/ iran_sans.ttf < / p >
< p > < br > < br > 方法一: 反射字体。class ||| 最好的方法

.class |||

在类extends Application中调用FontsOverride.setDefaultFont(),这段代码将导致所有软件字体被更改,甚至是Toasts字体

AppController.java

public class AppController extends Application {


@Override
public void onCreate() {
super.onCreate();


//Initial Font
FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");


}
}

FontsOverride.java

public class FontsOverride {


public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
replaceFont(staticTypefaceFieldName, regular);
}


private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) {
try {
final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
staticField.setAccessible(true);
staticField.set(null, newTypeface);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

< p > < br > < br > 方法2:使用setTypeface

对于特殊的视图,只需调用setTypeface()来更改字体。

CTextView.java

public class CTextView extends TextView {


public CTextView(Context context) {
super(context);
init(context,null);
}


public CTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}


public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}


@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context,attrs);
}


public void init(Context context, @Nullable AttributeSet attrs) {


if (isInEditMode())
return;


// use setTypeface for change font this view
setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));


}
}

FontUtils.java

public class FontUtils {


private static Hashtable<String, Typeface> fontCache = new Hashtable<>();


public static Typeface getTypeface(String fontName) {
Typeface tf = fontCache.get(fontName);
if (tf == null) {
try {
tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
} catch (Exception e) {
e.printStackTrace();
return null;
}
fontCache.put(fontName, tf);
}
return tf;
}


}

With Android 8.0 using Custom Fonts in Application With downloadable fonts变得很容易。 我们可以直接将字体添加到项目文件夹中的res/font/ folder中,这样做,字体将自动在Android Studio中可用

Folder Under res with name font and type set to font .

现在将fontFamily属性设置为字体列表或单击更多并选择您选择的字体。这将添加tools:fontFamily="@font/your_font_file"行到你的TextView。

这将自动生成一些文件

在values文件夹中创建fonts_certs.xml

2.在Manifest中它将添加以下行:

  <meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />

<强> 3。 preloaded_fonts.xml < / >强

<resources>
<array name="preloaded_fonts" translatable="false">
<item>@font/open_sans_regular</item>
<item>@font/open_sans_semibold</item>
</array>
</resources>

是的,正如人员Dipali年代所说,下载字体是如此简单。

你是这样做的……

  1. 放置TextView
  2. 在属性窗格中,选择fontFamily下拉菜单。如果它不在那里,找到插入符号的东西(>并单击它展开textAppearance)在。
  3. 展开font-family下拉菜单。
  4. 在这个小列表中,一直向下滚动,直到看到more fonts
  5. 这将打开一个对话框,您可以从Google Fonts搜索
  6. 用顶部的搜索栏搜索你喜欢的字体
  7. 选择字体。
  8. 选择你喜欢的字体风格(即粗体,正常,斜体等)
  9. 在右窗格中,选择显示Add font to project的单选按钮
  10. 点击好。现在你的TextView有你喜欢的字体!
< p >奖金: 如果你想在你的应用程序中使用选定的字体对所有文本进行样式化,只需在你的styles.xml

中添加<item name="android:fontfamily">@font/fontnamehere</item>

最简单的解决方案android支持现在!

使用自定义字体在xml:

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/[your font resource]"/>

看详细信息:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

  • 打开你的项目并选择左上角的项目
  • __abc0——> __abc1——> __abc2
  • 右键单击主目录并创建命名为资产的目录
  • 右键单击资产并创建新目录命名为字体
  • 你需要找到像免费字体这样的免费字体
  • 给你的Textview和调用它在你的活动类
  • 将字体复制到字体文件夹中
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); 字体字体=字体字体。createfromasset (getAssets(), "fonts/Aramis斜体。ttf"); txt.setTypeface(字体);< /代码> < /李>

字体名称必须正确,有乐趣