맞춤 글꼴 및 XML 레이아웃 (Android)


174

Android에서 XML 파일을 사용하여 GUI 레이아웃을 정의하려고합니다. 내가 알 수있는 한 위젯이 XML 파일의 사용자 정의 글꼴 (예 : 자산 / 글꼴 /에 배치 된 글꼴)을 사용해야하고 시스템 설치 글꼴 만 사용할 수 있도록 지정할 수있는 방법이 없습니다.

Java 코드에서 고유 ID를 사용하여 각 위젯의 글꼴을 수동으로 변경할 수 있음을 알고 있습니다. 또는 Java의 모든 위젯을 반복 하여이 변경을 수행 할 수는 있지만 아마도 매우 느릴 것입니다.

다른 옵션이 있습니까? 사용자 정의 모양의 위젯을 만드는 더 좋은 방법이 있습니까? 특히 내가 추가하는 모든 새 위젯에 대해 수동으로 글꼴을 변경하고 싶지 않습니다.


68
DrDefrost-일부 답변을 수락하면이 사이트에서 더 많은 답변을 얻을 수 있습니다.
SK9

1
여기에 비슷한 질문이 하나 더 있습니다 : stackoverflow.com/questions/9030204/…
Vins

2017 년 5 월 5 일 업데이트 : "지원 라이브러리 26.0 베타는 Android API 버전 14 이상을 실행하는 장치에서 XML의 글꼴 기능을 지원합니다." 참조 : developer.android.com/preview/features/…
albert c braun

답변:


220

여기서 배운 것처럼 TextView를 확장하여 사용자 정의 글꼴을 설정할 수 있습니다 .

TextViewPlus.java :

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xml : (값 / 값)

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

main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

"saxmono.ttf"를 자산 폴더 에 넣습니다 .

업데이트 8/1/13

이 방법에는 심각한 메모리 문제가 있습니다. 아래의 chedabob의 의견을 참조하십시오 .


5
그러나 멋지게 보이지만 main.xml에서 "TextViewPlus"를 사용하려고 할 때 오류가 발생합니다. -오류 : XML 구문 분석 오류 : 바인딩되지 않은 접두사- "supportLibs.TextViewPlus"요소 유형과 연관된 속성 "foo : customFont"에 대한 접두사 "foo"가 바인딩되지 않았습니다.
Majjoodi

79
주목해야 할 것은 수십 및 수십 개의 TypeFace 객체를 생성하고 메모리를 소비한다는 것입니다. 4.0 이전 버전의 Android에는 TypeFaces를 올바르게 해제하지 않는 버그가 있습니다. 가장 쉬운 방법은 HashMap을 사용하여 TypeFace 캐시를 만드는 것입니다. 이로 인해 내 앱의 메모리 사용량이 120MB에서 18MB로 줄었습니다. code.google.com/p/android/issues/detail?id=9904
chedabob

7
@Majjoodi : 레이아웃에 두 번째 네임 스페이스를 추가하는 것을 잊어 버린 경우 일반적으로 발생합니다.xmlns:foo="http://schemas.android.com/apk/res/com.example
Theo

11
매우 중요-저는 체다 밥의 조언을 두 배로 강조하고 싶습니다. 따르지 않는 한, ICS 프리에서 메모리 누수가 발생합니다. 솔루션은 거의 없으며 그중 하나는 chedabob이 제공하는 링크에 있으며 다른 하나는 여기 있습니다 : stackoverflow.com/questions/8057010/listview-memory-leak . 피터-답변을 업데이트하십시오-훌륭하지만 완전하지 않습니다
Michał K

1
너비 및 높이와 같은 다른 textview 속성 외에도 styles.xml에서이 사용자 정의 속성을 설정하는 방법은 무엇입니까?
loeschg

35

나는 파티에 3 년 늦었다. (그러나 이것은이 포스트를 우연히 발견 할 수있는 누군가에게 유용 할 수있다.

서체를 캐시하고 XML에서 사용자 정의 서체를 지정할 수있는 라이브러리를 작성했습니다. 여기 에서 라이브러리를 찾을 수 있습니다 .

XML 레이아웃을 사용할 때의 모습은 다음과 같습니다.

<com.mobsandgeeks.ui.TypefaceTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    geekui:customTypeface="fonts/custom_font.ttf" />

@ Ragunath-jawahar, gradle 프로젝트를 위해 라이브러리를 어떻게 가져 옵니까? 나는 시도 compile 'com.mobsandgeeks:android-typeface-textview:1.0'했지만 작동하지 않았다.
aimango 2016 년

1
그런 식으로 사용하려면 AAR이 필요합니다. 아직 없습니다. 소스를 복사하고 지금 Android Studio 라이브러리 프로젝트를 빌드 할 수 있습니다.
Ragunath Jawahar 2016

2
geekui 태그의 복용량은 어디입니까?
sefirosu

3
부모 태그에 지정된 네임 스페이스에서 –xmlns:geekui="http://schemas.android.com/apk/res-auto"
Ragunath Jawahar

1
@MuhammedRefaat, 그렇습니다 :)
Ragunath Jawahar

18

약간 늦을 수 있지만 메모리 누수를 피하기 위해 사용자 정의 서체를 반환하는 싱글 톤 클래스를 만들어야합니다.

TypeFace 클래스 :

public class OpenSans {

private static OpenSans instance;
private static Typeface typeface;

public static OpenSans getInstance(Context context) {
    synchronized (OpenSans.class) {
        if (instance == null) {
            instance = new OpenSans();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), "open_sans.ttf");
        }
        return instance;
    }
}

public Typeface getTypeFace() {
    return typeface;
}
}

맞춤 TextView :

public class NativelyCustomTextView extends TextView {

    public NativelyCustomTextView(Context context) {
        super(context);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

}

xml로 :

<com.yourpackage.views.NativelyCustomTextView
            android:id="@+id/natively_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="@string/natively"
            android:textSize="30sp" /> 

프로그래밍 방식으로 :

TextView programmaticallyTextView = (TextView) 
       findViewById(R.id.programmatically_text_view);

programmaticallyTextView.setTypeface(OpenSans.getInstance(this)
                .getTypeFace());

런타임에 작동하는 것 같지만 디자이너에서도 작동해야합니까?
Magnus Johansson

확실한. xml로 사용할 수 있습니다. @ 매그너스
레오나르도 카르도소

나는 당신이 오해했다고 생각합니다. 디자인 타임 (디자이너 미리보기) 에서는 작동하지 않는 것 같습니다 . (xml! = 디자이너). 런타임으로 컴파일 된 Xml 레이아웃 파일에 지정된대로 작동합니다. 어쨌든, 나는이 확장 github.com/danh32/Fontify을 사용하고 있습니다.이 확장 은 내 요구에 훨씬 잘 작동합니다 (여러 글꼴 스타일, 일반, 굵게 등뿐만 아니라 다른 글꼴 이름뿐만 아니라 TextView 이외의 다른 컨트롤을 지원합니다)
매그너스 요한슨

2
getTypeFace는 모든 호출에서 새로운 서체를 생성합니다 ... 이것은 싱글 톤의 목적을 무효화합니다. 처음 호출 할 때 설정되고 후속 호출에서 필드 값을 리턴하는 정적 필드가 있어야합니다.
Steven Pena

1
@chiwai 당신이 맞아요! 첫 번째 질문에 대해서는 필요하지 않습니다. 두 번째로 오타였습니다.
Leonardo Cardoso

13

오래된 질문이지만 좋은 해결책을 찾기 위해 자신의 검색을 시작하기 전에이 대답을 읽으십시오. 서예android:fontFamily속성을 확장하여 다음과 같이 자산 폴더에 사용자 정의 글꼴에 대한 지원을 추가합니다.

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

그것을 활성화하기 위해해야 ​​할 유일한 것은 사용중인 활동의 컨텍스트에 첨부하는 것입니다.

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

자신의 사용자 정의 속성을 지정하여 바꿀 수도 있습니다 android:fontFamily

또한 AppTheme을 포함한 테마에서도 작동합니다.


8

DataBinding 사용 :

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName){
 textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

XML에서 :

<TextView
app:font="@{`Source-Sans-Pro-Regular.ttf`}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

글꼴 파일은 assets/fonts/


7

추가하려는 서체가 하나만 있고 더 적은 코드를 작성하려는 경우 특정 글꼴에 대한 전용 TextView를 만들 수 있습니다. 아래 코드를 참조하십시오.

package com.yourpackage;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {
    public static Typeface FONT_NAME;


    public FontTextView(Context context) {
        super(context);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
}

main.xml에서 다음과 같이 textView를 추가 할 수 있습니다.

<com.yourpackage.FontTextView
    android:id="@+id/tvTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />

init () 에서이 작업을 수행하고 동일한 호출을 3 배 절약하십시오.
ericosg

오류 팽창 클래스 com.ascent.adwad.utils.CustomTextView : # 9 바이너리 XML 파일 라인 : @ericosg 나는 yourthis 솔루션 android.view.InflateException을 사용하여이 오류
사가르 Devanga

@SagarDevanga, 추가 정보 없이는 도움이되지 않습니다. 아마도 당신이 할 수있는 한 그것을 가지고 새로운 질문을 할 것입니다.
ericosg

7

안드로이드 O의 프리뷰 버전에서 그것을 할 수있는 가장 좋은 방법은이 방법
1)을 마우스 오른쪽 단추로 클릭하고 폴더 고해상도 와 이동 새로 만들기> 안드로이드 자원 디렉토리를 . New
Resource Directory 창이 나타납니다.
리소스 유형 목록에서 font 를 선택한 다음 확인을 클릭합니다.
3.) 폰트 폴더에 폰트 파일을 추가하십시오 . 아래의 폴더 구조는 R.font.dancing_script, R.font.la_la 및 R.font.ba_ba를 생성합니다.
4.) 글꼴 파일을 두 번 클릭 하여 편집기에서 파일의 글꼴을 미리 봅니다.

다음으로 폰트 패밀리를 만들어야합니다

1.) 글꼴 폴더를 마우스 오른쪽 단추로 클릭하고 새로 작성> 글꼴 자원 파일 로 이동 하십시오 . 새 리소스 파일 창이 나타납니다. 파일 이름을
입력 한 다음 확인을 클릭 합니다. 새 글꼴 리소스 XML이 편집기에서 열립니다.
3) 각 글꼴 파일, 스타일 및 가중치 속성을 글꼴 태그 요소에 포함하십시오. 다음 XML은 글꼴 자원 XML에 글꼴 관련 속성을 추가하는 방법을 보여줍니다.

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
    android:fontStyle="normal"
    android:fontWeight="400"
    android:font="@font/hey_regular" />
    <font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/hey_bababa" />
</font-family>

TextView에 글꼴 추가하기 :

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

설명서에서와 같이

폰트로 작업하기

모든 단계가 정확합니다.


1
가장 좋은 답변! 글꼴 파일 이름은 소문자 여야합니다.
Dmitry

또한 AndroidManifest 파일 아래에서 애플리케이션에 적용하는 사용자 정의 스타일을 작성하면 모든보기에 제공됩니다. 예를 들어 단일 TextView에 배치하는 대신 툴바에 영향을 미치지 않습니다.
goldenmaza 2012 년

5

확장 TextView하고 맞춤 속성을 제공하거나 android : tag 속성을 사용하여 사용하려는 글꼴의 문자열을 전달하십시오. 모든 글꼴을 res / assets / fonts / 폴더에 배치하여 TextView 클래스가 찾을 위치를 알 수 있도록 규칙을 선택하고이를 준수해야합니다. 그런 다음 생성자에서 슈퍼 호출 후 글꼴을 수동으로 설정하십시오.


4

사용자 정의 글꼴을 사용하는 유일한 방법은 소스 코드를 통하는 것입니다.

Android는 리소스가 매우 제한된 기기에서 실행되며 글꼴에는 많은 양의 RAM이 필요할 수 있습니다. 기본 제공 Droid 글꼴은 특별히 제작되었으며, 참고하면 많은 문자와 장식이 없습니다.


"안드로이드는 리소스가 매우 제한된 기기에서 실행된다는 점을 기억하십시오."-> 점점 줄어들고 있습니다. 쿼드 코어 폰? 정말??
Sandy

9
tareqHs의 답변의 맥락을 고려하여 더 많은 것을 보여 드리고 싶습니다.
SK9

귀하의 답변의 첫 번째 부분은 2010 년에 귀하의 답변을 썼을 때 사실 일 수 있습니다. 후자는 초 유체이며 요점은 다음과 같습니다. 드로이드는 나빴으며 2012 년 Roboto를 위해 Google에 의해 버렸습니다. 안드로이드에서 타이포그래피의 선택의 결여는 기능이 아니라 결함이다. iOS는 2008 년부터 오늘날의 표준에 따라 기본 장치 하에서 개발자가 여러 글꼴을 사용할 수있게되었습니다.
cosmix

이 답변은 더 이상 유효하지 않습니다.
Martin Konecny

2

TextView를 확장하고 긴 코드를 구현하지 않고 질문에 대한 간단한 대답이있을 수 있습니다.

코드 :

 TextView tv = (TextView) findViewById(R.id.textview1);
    tv.setTypeface(Typeface.createFromAsset(getAssets(), "font.ttf"));

평소와 같이 사용자 정의 글꼴 파일을 자산 폴더에 넣고 이것을 시도하십시오. 그것은 나를 위해 작동합니다. 나는 피터가 왜이 간단한 것에 대해 그렇게 큰 코드를 주 었는지 또는 이전 버전에서 그의 대답을했는지 이해하지 못합니다.


2

또한 사용자 정의 클래스를 만들지 않고도 XML에서 정의 할 수 있습니다

style.xml

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

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/ionicons"
        android:text=""/>
</LinearLayout>

간단한 참고 사항은 글꼴을 어디에 두어야하는지 항상 잊었 기 때문에 글꼴 assets이 있어야하며이 폴더는 같은 수준에 res있으며 src내 경우에는assets/fonts/ionicons.ttf

업데이트 된 이 방법이 필요하기 때문에 추가 루트 레이아웃을 xmlns:app="http://schemas.android.com/apk/res-auto"작업에

업데이트 2 서예 라고 부르기 전에 설치 한 라이브러리를 잊어 버렸습니다.


이것은 나를 위해 작동하지 않습니다. 이것을 만들려고 할 때 오류 메시지가 나타납니다. 오류 : (49, 5) 주어진 이름과 일치하는 리소스를 찾을 수 없습니다 : attr 'fontPath'.
Stef

xmlns:app="http://schemas.android.com/apk/res-auto"루트 레이아웃에 추가 하고 업데이트 된 답변도 확인하십시오
norman784

레이아웃 XML 파일이 아니라 스타일 XML 파일에서 오류가 발생합니다. fontPath가 무엇인지 '알지 못하는 것 같습니다.
Stef

귀하의 권리는, 내가 Calligrapy라는 라이브러리를했습니다 것을 잊었다
norman784

1

Peter의 답변이 가장 좋지만 Android의 styles.xml을 사용하여 앱의 모든 텍스트보기에 대한 글꼴을 사용자 정의하면 개선 될 수 있습니다.

내 코드는 여기


1

글꼴을 사용자 정의하는 두 가지 방법이 있습니다.

!!! assets / fonts / iran_sans.ttf의 내 사용자 정의 글꼴

방법 1 : Refrection Typeface.class ||| 가장 좋은 방법은

클래스 확장에서 FontsOverride.setDefaultFont ()를 호출하면 Application이 확장됩니다.이 코드는 모든 소프트웨어 글꼴이 변경되도록합니다.

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();
        }
    }
}

방법 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;
    }

}


0

당신은 쉽게 사용자 정의 textview 클래스를 만들 수 있습니다 :-

먼저해야 할 일은 Custom textview으로 확장 된 클래스를 만드십시오 AppCompatTextView.

public class CustomTextView extends AppCompatTextView {
    private int mFont = FontUtils.FONTS_NORMAL;
    boolean fontApplied;

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

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

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

    protected void init(AttributeSet attrs, Context cxt) {
        if (!fontApplied) {
            if (attrs != null) {
                mFont = attrs.getAttributeIntValue(
                        "http://schemas.android.com/apk/res-auto", "Lato-Regular.ttf",
                        -1);
            }
            Typeface typeface = getTypeface();
            int typefaceStyle = Typeface.NORMAL;
            if (typeface != null) {
                typefaceStyle = typeface.getStyle();
            }
            if (mFont > FontUtils.FONTS) {
                typefaceStyle = mFont;
            }
            FontUtils.applyFont(this, typefaceStyle);
            fontApplied = true;
        }
    }
}

이제 사용자 정의 텍스트보기가 호출 될 때마다 속성에서 int 값을 얻습니다 int fontValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","Lato-Regular.ttf",-1).

또는

xml ( android:textStyle="bold|normal|italic") 에서 설정 한 뷰에서 getTypeface ()를 가져올 수도 있습니다 . 당신이하고 싶은 일을하십시오.

이제 FontUtils.ttf 글꼴을보기로 설정했습니다.

public class FontUtils {

    public static final int FONTS = 1;
    public static final int FONTS_NORMAL = 2;
    public static final int FONTS_BOLD = 3;
    public static final int FONTS_BOLD1 = 4;

    private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();

    static Typeface getFonts(Context context, String name) {
        Typeface typeface = TYPEFACE.get(name);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(context.getAssets(), name);
            TYPEFACE.put(name, typeface);
        }
        return typeface;
    }

    public static void applyFont(TextView tv, int typefaceStyle) {

        Context cxt = tv.getContext();
        Typeface typeface;

        if(typefaceStyle == Typeface.BOLD_ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }else if (typefaceStyle == Typeface.BOLD || typefaceStyle == SD_FONTS_BOLD|| typefaceStyle == FONTS_BOLD1) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-SemiBold.ttf");
        } else if (typefaceStyle == Typeface.ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Thin.ttf");
        } else {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }
        if (typeface != null) {
            tv.setTypeface(typeface);
        }
    }
}

0

Android 8.0 (API 레벨 26) 부터 XML의 사용자 정의 글꼴을 사용할 수 있음을 아는 것이 유용 할 수 있습니다 .

다음과 같은 방법으로 사용자 정의 글꼴을 전체 응용 프로그램에 적용 할 수 있습니다.

  1. 폴더에 글꼴을 넣습니다 res/font.

  2. 에서 res/values/styles.xml응용 프로그램 테마에 사용되는 그것. <style name="AppTheme" parent="{whatever you like}"> <item name="android:fontFamily">@font/myfont</item> </style>



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.