如何在以Android Studio编写的项目中使用自定义字体


Answers:


332

2020年更新:

res文件夹中创建一个名为font的文件夹,然后复制您的字体

在此处输入图片说明

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

用于程序设计:

textView.setTypeface(ResourcesCompat.getFont(context, R.font.abc_font))

10
从资产加载自定义字体的任何人都应该注意,Android 5.0中存在一个错误,其中某些字体无法加载。虽然此问题已在Android 5.1中修复,但一种支持5.0的解决方法是重写ttf字体。有关更多信息
请参见此

第二个选项对我来说非常合适。谢谢你!
Emzor '16

2
我使用this.getContext()。getApplicationContext()。getAssets()查找目录(android studio 2.1)
kuzdu

1
@kuthue onCreate()很好。如果要在用户使用应用程序时更改字体,可以将其放在希望更改的位置。这也适用于按钮
Rockhammer

1
如何设置整个项目的默认字体为我要添加的自定义字体?那是第一个代码示例正在做的事情吗?
Yonatan Nir

97

https://i.stack.imgur.com/i6XNU.png

  1. 选择文件>新建>文件夹>资产文件夹

  2. 点击完成

  3. 右键单击资产并创建一个名为fonts的文件夹

  4. 将字体文件放入资源 > 字体

  5. 使用下面的代码更改textView的字体

    TextView textView = (TextView) findViewById(R.id.textView);
    Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/yourfont.ttf");
    textView.setTypeface(typeface);

12
如何在xml中使用它?
瑞士,

4
本教程介绍了如何在XML中使用它: stacktips.com/tutorials/android/…–
Dinesh

@Suisse支持库26此功能提供上运行的API版本14及更高版本的设备全面支持链接
Ehsan.R

65

有很多方法可以在字段上设置自定义字体系列,而我使用的方法如下。

要将字体添加为资源,请在Android Studio中执行以下步骤:

1)右键单击res文件夹,然后转到“新建”>“ Android资源目录”。出现“新资源目录”窗口。

2)在资源类型列表中,选择字体,然后单击确定。

注意:资源目录的名称必须是字体。

3)在字体文件夹中添加字体文件。 在此处输入图片说明

在xml文件的所需视图中添加字体:

在此处输入图片说明

注意:但是您需要执行以下操作:

  1. Android Studio以上为3.0 Canary。

  2. 您的活动扩展了AppCompatActivity。

  3. 像这样更新您的Gradle文件:

    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {        
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

buildtoolsVersion高于26,最低targetSdkVersion要求26

  1. 在build.gradle文件中添加依赖项:
classpath 'com.android.tools.build:gradle:3.0.0-beta4'
  1. gradle-wrapper.properties:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

41

我认为我们可以使用Google字体而不是下载.ttf文件。这很容易实现。只有您必须执行以下步骤。 步骤1)打开项目的layout.xml,并在属性中选择文本视图的选择字体系列(随附参考屏幕截图) 在此处输入图片说明

步骤2)如果字体不存在,请在字体家族中选择“更多字体..”选项。然后您将看到一个新窗口将打开,您可以在其中键入所需的字体并从该列表中选择所需的字体,例如,Regular,Bold,Italic等。如下图所示。 在此处输入图片说明

步骤3)然后,您将观察到/ res文件夹中将自动生成一个字体文件夹,其中包含您选择的字体xml文件。

在此处输入图片说明

然后,您可以直接在xml中使用此字体系列,如下所示:

      android:fontFamily="@font/josefin_sans_bold"

或者在编程上,您可以通过使用

  Typeface typeface = ResourcesCompat.getFont(this, R.font.app_font);
  fontText.setTypeface(typeface);

这不是问题的答案。并非每种字体都可以在Google字体上使用。
马特·弗莱彻

2
好答案!如果您在列表中找不到字体,则将其加载到assets文件夹中,或者通过xml进行定义
Edgar Khimich

21

您好,在这里,我们有一种更好的方法可以在Android上的EditTexts和TextViews上一次应用字体,并将其应用到整个项目中。

首先,您需要制作字体文件夹。这是步骤。

1:转到(项目文件夹)然后app> src> main

2:在主文件夹中创建名为“ assets / fonts”的文件夹。

3:将字体放入字体文件夹。这里我有'MavenPro-Regular.ttf'

这是在EditText上应用自定义字体的步骤,使用这种方法,您可以在每个输入上应用字体。

1:创建一个类MyEditText(您的首选名称...)

2:扩展EditText

3:套用您的字型

这是代码示例;

public class MyEditText extends EditText {

    public MyEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyEditText(Context context) {
        super(context);
        init();
    }

    private void init() {
        if (!isInEditMode()) {
            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/MavenPro-Regular.ttf");
            setTypeface(tf);
        }
    }

}

在这里是代码如何使用它。

MyEditText editText = (MyEditText) findViewById(R.id.editText);

editText.setText("Hello");

或在您的xml文件中

   <MyEditText
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:textColor="#fff"
    android:textSize="16dp"
    android:id="@+id/editText"
    />

该类在运行时给了我该错误:夸大类MyEditText的错误
GMX

引用此链接,您可能会发现一些解决错误的提示。
Mohammad Naim Dahee


对于当前版本,我认为您需要将其更改为“扩展AppCompatEditText”。
柴油

15

使用Support Library 26.0(和Android O),可以轻松地从资源中加载字体: 在此处输入图片说明

Typeface typeface = ResourcesCompat.getFont(Context context, int fontResourceId) 

该方法的文档

更多信息可以在这里找到


9

我想为Android-O和Android Studio 2.4添加答案

  1. res文件夹下创建一个名为font的文件夹。下载要添加到项目示例Google字体中的各种字体

  2. 在您的xml用户字体系列中

    例如:

    <TextView
        android:fontFamily="@font/indie_flower"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="@string/sample_text" />

3.如果您希望它以编程方式使用以下代码

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

有关更多信息,请单击我的博客文章的链接。带有Android Studio 2.4的Android字体样式


6
请注意,如果您要推广自己的产品/博客,则必须披露您的隶属关系,否则您的答案可能被标记为垃圾邮件。请阅读“ 如何成为垃圾邮件发送者
DavidPostill '17

是@PetterFriberg
Suresh Maidaragi

8

根据Android O中可用的新功能,可以使用XML中的字体资源作为新功能。

要将字体添加为资源,请在Android Studio中执行以下步骤:

1)右键单击res文件夹,然后转到新建> Android资源目录。出现“新资源目录”窗口。

2)在资源类型列表中,选择字体,然后单击确定。

注意:资源目录的名称必须是字体。

3)在字体文件夹中添加字体文件。

您可以在新资源类型font的帮助下访问字体资源。例如,要访问字体资源,请使用@ font / myfont或R.font.myfont。

例如。 Typeface typeface = getResources().getFont(R.font.myfont); textView.setTypeface(typeface);


2
应该是ResourcesCompat.getFont(context,R.font.your_font)
Trung Le

7

您可以使用简单的EasyFonts第三方库将各种自定义字体设置为TextView。通过使用该库,您不必担心下载字体并将其添加到asset / fonts文件夹中。也关于字体对象的创建。您也将无需创建资产文件夹。

只是:

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

该库提供了许多类型的字体。


6

1在字体文件夹上添加font.ttf文件。然后在onCreate方法中添加此行

    Typeface typeface = ResourcesCompat.getFont(getApplicationContext(), R.font.myfont);
    mytextView.setTypeface(typeface);

这是我的xml

            <TextView
            android:id="@+id/idtext1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="7dp"
            android:gravity="center"
            android:text="My Text"
            android:textColor="#000"
            android:textSize="10sp"
        />

4
  1. 在Project-> app(或您的应用名称)-> src-> main->右键单击-> New-> Directory中创建文件夹资产。
  2. 然后在资产内创建一个名为“ fonts”的新目录。

要将字体分配给textView:

TextView textView = (TextView) findViewById(R.id.your_textView);

final Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/your_font_name");

your_font_name包括字体扩展名。


3

如果您像我这样刚接触Android,这可能会有些棘手。确保您致电:

TextView myTextView = (TextView) findViewById(R.id.textView);
Typeface typeface=Typeface.createFromAsset(getAssets(), "fonts/your font.ttf");
myTextView.setTypeface(typeface);

方法之类的方法中的方法onCreate


3

Android 8.0(API 26)引入了与字体相关的新功能。

1)字体可以用作资源。

2)可下载的字体。

如果要在Android应用程序中使用外部字体,则可以将字体文件包含在apk中,也可以配置可下载的字体。

在APK中包括字体文件:您可以下载字体文件,将它们保存在res / font filer中,定义字体系列并在样式中使用字体系列。

有关使用自定义字体作为资源的更多详细信息,请参见http://www.zoftino.com/android-using-custom-fonts

配置可下载字体:通过提供字体提供者详细信息来定义字体,添加字体提供者证书并在样式中使用字体。

有关可下载字体的更多详细信息,请参见http://www.zoftino.com/downloading-fonts-android



1
同样,仅因为自定义/可下载字体是在Android O(8.0)中引入的,并不意味着它没有向后兼容性。请参阅有关如何实现自定义字体的官方文档。请注意,您可能还需要安装Android Studio 3.0。
anthonymonori

1

首先创建assets文件夹,然后fonts在其中创建文件夹。

然后,你可以设置fontassetsdirectory类似波纹管:

public class FontSampler extends Activity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        TextView tv = (TextView) findViewById(R.id.custom);
        Typeface face = Typeface.createFromAsset(getAssets(), "fonts/HandmadeTypewriter.ttf");

        tv.setTypeface(face);

        File font = new File(Environment.getExternalStorageDirectory(), "MgOpenCosmeticaBold.ttf");

        if (font.exists()) {
            tv = (TextView) findViewById(R.id.file);
            face = Typeface.createFromFile(font);

            tv.setTypeface(face);
        } else {
            findViewById(R.id.filerow).setVisibility(View.GONE);
        }
    }
} 

1

现在有很多应用字体的方法,最简单的方法之一就是这样,1)右键单击res文件夹,转到New> Android resource directory。

2)从资源类型列表中,选择字体,然后单击确定。

3)将字体文件放在字体文件夹中。


1

将您的字体添加到app / src / main / assets中的assets文件夹中,以使自定义textview像这样:

class CustomLightTextView : TextView {

constructor(context: Context) : super(context){
    attachFont(context)
}
constructor(context: Context, attrs: AttributeSet):    super(context, attrs){
    attachFont(context)
}
constructor(context: Context, attrs: AttributeSet?,    defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    attachFont(context)
}
fun attachFont(context: Context) {
    this.setTypeface(FontCache.getInstance().getLightFont(context))
}

}

添加FontCache:这样您就不必像这样反复创建字体:

class FontCache private constructor(){

val fontMap = HashMap<String,Typeface>()

companion object {
    private var mInstance : FontCache?=null
    fun getInstance():FontCache = mInstance?: synchronized(this){
        return mInstance?:FontCache().also { mInstance=it }
    }
}

fun getLightFont(context: Context):Typeface?{
    if(!fontMap.containsKey("light")){
        Typeface.createFromAsset(context.getAssets(),"Gotham-Book.otf");
        fontMap.put("light",Typeface.createFromAsset(context.getAssets(),"Gotham-Book.otf"))
    }
    return fontMap.get("light")
}

}

您完成了!

PS从android O,您可以直接添加字体。


1

将字体放在资产文件夹中,然后应用fontfamily:''您的字体


-1

对于新读者

您可以使用此库 Gloxey自定义字体视图

gradle依赖

  dependencies{
           compile 'io.gloxey.cfv:custom-font-views:1.0.2'
    }

如何使用?

创建文件夹资产 -> 字体。将字体复制到fonts文件夹中。

使用属性app:font_name =“ font_name_string”在视图上应用字体。

   <!--Font Names in srings.xml-->
       <string name="aadhunik">aadhunik.ttf</string>
       <string name="kung_fool">kungfool.ttf</string>
       <string name="skrova">skrova.otf</string>
       <string name="painting_in_the_sun_light">painting_in_the_sun_light.ttf</string>

   <!--Include views in layout.xml-->
       <io.gloxey.cfv.CFTextView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:gravity="center"
       android:text="Aadhunik"
       android:textColor="#ff00"
       android:textSize="40sp"
       app:font_name="@string/aadhunik" />

       <io.gloxey.cfv.CFButton
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="Kung Fool"
       android:textColor="#154748"
       app:font_name="@string/kung_fool" />

       <io.gloxey.cfv.CFEditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:gravity="center"
       android:text="Hello world"
       android:textSize="30sp"
       app:font_name="@string/skrova" />

       <io.gloxey.cfv.CFCheckBox
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center"
       android:text="Painting In The Sun Light"
       android:textSize="30sp"
       app:font_name="@string/painting_in_the_sun_light" />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.