Programing

전체 Android 앱에 기본 글꼴 모음을 설정하는 방법

lottogame 2020. 4. 5. 19:51
반응형

전체 Android 앱에 기본 글꼴 모음을 설정하는 방법


내 앱에서 Roboto light 글꼴을 사용하고 있습니다. 글꼴을 설정하려면 android:fontFamily="sans-serif-light"모든보기에 를 추가해야 합니다. Roboto 글꼴을 전체 앱의 기본 글꼴 모음으로 선언하는 방법이 있습니까? 나는 이렇게 시도했지만 작동하지 않는 것 같습니다.

<style name="AppBaseTheme" parent="android:Theme.Light"></style>

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

대답은 '예'입니다.

글로벌 로봇 조명 TextViewButton클래스 :

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="android:buttonStyle">@style/RobotoButtonStyle</item>
</style>

<style name="RobotoTextViewStyle" parent="android:Widget.TextView">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

<style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

themes.xml 목록에서 원하는 스타일을 선택한 다음 원래 스타일을 기반으로 사용자 정의 스타일을 만듭니다. 마지막으로 스타일을 응용 프로그램의 테마로 적용하십시오.

<application
    android:theme="@style/AppTheme" >
</application>

Roboto와 같은 내장 글꼴에서만 작동하지만 문제였습니다. 애셋에서로드 된 사용자 정의 글꼴의 경우이 방법이 작동하지 않습니다.

08/13/15 수정

AppCompat 테마를 사용하는 경우 android:접두사 를 제거해야 합니다. 예를 들면 다음과 같습니다.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="buttonStyle">@style/RobotoButtonStyle</item>
</style>

(가) 주 buttonStyle포함하지 않는 android:접두사를하지만, textViewStyle그것을 포함해야합니다.


Android Oreo가 출시되면 지원 라이브러리를 사용하여이 목표를 달성 할 수 있습니다.

  1. 지원 라이브러리 > = 26.0.0 이있는 경우 build.gradle을 확인하십시오.
  2. 리소스 폴더에 " font "폴더를 추가하고 거기에 글꼴을 추가하십시오
  3. 앱 기본 스타일에서 기본 글꼴 모음을 참조하십시오.

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       <item name="android:fontFamily">@font/your_font</item>
       <item name="fontFamily">@font/your_font</item> <!-- target android sdk versions < 26 and > 14 if theme other than AppCompat -->
    </style>
    

자세한 내용은 https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html확인 하십시오 .


아래의 업데이트 읽기

새 글꼴을 포함하는 것과 동일한 문제가 발생하여 마침내 TextView를 확장하고 내부에서 글꼴을 설정하는 작업을 수행했습니다.

public class YourTextView extends TextView {

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

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

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

    private void init() {
        Typeface tf = Typeface.createFromAsset(context.getAssets(),
            "fonts/helveticaneue.ttf");
        setTypeface(tf);
    }
}

나중에 모든 요소에서 TextView 요소를에서 요소로 변경해야합니다. 그리고 Eclipse에서 UI-Creator를 사용하는 경우 때때로 TextView가 올바르게 표시되지 않습니다. 나를 위해 일한 유일한 사람이었습니다 ...

최신 정보

요즘에는 TextView를 확장하지 않고 전체 응용 프로그램에서 서체를 변경하기 위해 리플렉션을 사용하고 있습니다. 이 SO 게시물을 확인하십시오

업데이트 2

API 레벨 26부터 '지원 라이브러리'에서 사용 가능

android:fontFamily="@font/embeddedfont"

추가 정보 : XML의 글꼴


앱 글꼴을 변경하려면 다음 단계를 따르십시오.

  1. res디렉토리 안에 새 디렉토리를 만들고 호출합니다 font.
  2. 서체 폴더 안에 서체 .ttf / .otf를 삽입하십시오. 서체 이름은 소문자와 밑줄 만 사용해야합니다.
  3. 내부 res-> values-> styles.xml내부 <resources>-> <style>글꼴을 추가하십시오 <item name="android:fontFamily">@font/font_name</item>.

여기에 이미지 설명을 입력하십시오

이제 모든 앱 텍스트가 추가 한 내용에 속합니다.


성능에 대해 이야기하지 말고 사용자 정의 글꼴의 경우 모든보기를 통해 재귀 메소드 루프를 사용하고 TextView 인 경우 서체를 설정할 수 있습니다.

public class Font {
    public static void setAllTextView(ViewGroup parent) {
        for (int i = parent.getChildCount() - 1; i >= 0; i--) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                setAllTextView((ViewGroup) child);
            } else if (child instanceof TextView) {
                ((TextView) child).setTypeface(getFont());
            }
        }
    }

    public static Typeface getFont() {
        return Typeface.createFromAsset(YourApplicationContext.getInstance().getAssets(), "fonts/whateverfont.ttf");
    }
}

모든 활동에서 setContentView 후에 현재 ViewGroup을 전달하십시오.

ViewGroup group = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
Font.setAllTextView(group);

조각의 경우 비슷한 것을 할 수 있습니다.


전체 앱 에서이 작업을 수행하는 또 다른 방법은이 답변을 기반으로 리플렉션을 사용하는 것입니다.

public class TypefaceUtil {
    /**
     * Using reflection to override default typefaces
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE
     * OVERRIDDEN
     *
     * @param typefaces map of fonts to replace
     */
    public static void overrideFonts(Map<String, Typeface> typefaces) {
        try {
            final Field field = Typeface.class.getDeclaredField("sSystemFontMap");
            field.setAccessible(true);
            Map<String, Typeface> oldFonts = (Map<String, Typeface>) field.get(null);
            if (oldFonts != null) {
                oldFonts.putAll(typefaces);
            } else {
                oldFonts = typefaces;
            }
            field.set(null, oldFonts);
            field.setAccessible(false);
        } catch (Exception e) {
            Log.e("TypefaceUtil", "Can not set custom fonts");
        }
    }

    public static Typeface getTypeface(int fontType, Context context) {
        // here you can load the Typeface from asset or use default ones
        switch (fontType) {
            case BOLD:
                return Typeface.create(SANS_SERIF, Typeface.BOLD);
            case ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.ITALIC);
            case BOLD_ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.BOLD_ITALIC);
            case LIGHT:
                return Typeface.create(SANS_SERIF_LIGHT, Typeface.NORMAL);
            case CONDENSED:
                return Typeface.create(SANS_SERIF_CONDENSED, Typeface.NORMAL);
            case THIN:
                return Typeface.create(SANS_SERIF_MEDIUM, Typeface.NORMAL);
            case MEDIUM:
                return Typeface.create(SANS_SERIF_THIN, Typeface.NORMAL);
            case REGULAR:
            default:
                return Typeface.create(SANS_SERIF, Typeface.NORMAL);
        }
    }
}

그런 다음 글꼴을 재정의 할 때마다 메서드를 호출하고 다음과 같이 서체 맵을 제공 할 수 있습니다.

Typeface regular = TypefaceUtil.getTypeface(REGULAR, context);
Typeface light = TypefaceUtil.getTypeface(REGULAR, context);
Typeface condensed = TypefaceUtil.getTypeface(CONDENSED, context);
Typeface thin = TypefaceUtil.getTypeface(THIN, context);
Typeface medium = TypefaceUtil.getTypeface(MEDIUM, context);
Map<String, Typeface> fonts = new HashMap<>();
fonts.put("sans-serif", regular);
fonts.put("sans-serif-light", light);
fonts.put("sans-serif-condensed", condensed);
fonts.put("sans-serif-thin", thin);
fonts.put("sans-serif-medium", medium);
TypefaceUtil.overrideFonts(fonts);

전체 예제 확인

이전 버전의 Android SDK 21 이상에서만 작동합니다. 전체 예를 확인하십시오.


이 lib를 사용하여 등급 파일로 컴파일하십시오.

complie'me.anwarshahriar:calligrapher:1.0'

주요 활동의 onCreate 메소드에서 사용하십시오.

Calligrapher calligrapher = new Calligrapher(this);
calligrapher.setFont(this, "yourCustomFontHere.ttf", true);

이것이 가장 우아한 슈퍼 빠른 방법입니다.


이것은 내 프로젝트, 소스 https://gist.github.com/artem-zinnatullin/7749076에 대한 작업입니다.

Asset Folder 내에 fonts 디렉토리를 만든 다음 사용자 정의 글꼴을 fonts 디렉토리에 복사합니다 (예 : trebuchet.ttf를 사용하고 있습니다).

TypefaceUtil.java 클래스를 작성하십시오.

import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;

import java.lang.reflect.Field;
public class TypefaceUtil {

    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
        try {
            final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

            final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
            defaultFontTypefaceField.setAccessible(true);
            defaultFontTypefaceField.set(null, customFontTypeface);
        } catch (Exception e) {

        }
    }
}

styles.xml에서 테마 편집 아래 추가

<item name="android:typeface">serif</item>

내 styles.xml의 예

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:typeface">serif</item><!-- Add here -->
    </style>


    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="android:windowFullscreen">true</item>
    </style>
</resources>

마지막으로, Activity 또는 Fragment에서 CreateCreate TypeTypeUtil.java를 호출하십시오.

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TypefaceUtil.overrideFont(getContext(), "SERIF", "fonts/trebuchet.ttf");
    }

Android는 전체 앱에 글꼴을 적용 할 수있는 방법을 많이 제공하지 않습니다 (이 문제 참조 ). 전체 앱의 글꼴을 설정하는 4 가지 옵션이 있습니다.

  • 옵션 1 : 반사를 적용하여 시스템 글꼴 변경
  • 옵션 2 : 사용자 정의 글꼴이 필요한 각보기에 대한 사용자 정의보기 클래스 작성 및 서브 클래스
  • 옵션 3 : 현재 화면의 뷰 계층 구조를 통과하는 뷰 크롤러 구현
  • 옵션 4 : 타사 라이브러리를 사용하십시오.

이러한 옵션에 대한 자세한 내용은 여기를 참조하십시오 .


나는이 질문이 꽤 오래되었다는 것을 알고 있지만 좋은 해결책을 찾았습니다. 기본적으로 컨테이너 레이아웃을이 함수에 전달하면 지원되는 모든보기에 글꼴이 적용되고 자식 레이아웃에서 재귀 적으로 순환됩니다.

public static void setFont(ViewGroup layout)
{
    final int childcount = layout.getChildCount();
    for (int i = 0; i < childcount; i++)
    {
        // Get the view
        View v = layout.getChildAt(i);

        // Apply the font to a possible TextView
        try {
            ((TextView) v).setTypeface(MY_CUSTOM_FONT);
            continue;
        }
        catch (Exception e) { }

        // Apply the font to a possible EditText
        try {
            ((TextView) v).setTypeface(MY_CUSTOM_FONT);
            continue;
        }
        catch (Exception e) { }

        // Recursively cicle into a possible child layout
        try {
            ViewGroup vg = (ViewGroup) v;
            Utility.setFont(vg);
            continue;
        }
        catch (Exception e) { }
    }
}

에 응용 프로그램의 단지 세트 서체로 normal, sans, serif또는 monospace(가 아닌 사용자 정의 글꼴로!), 당신은이 작업을 수행 할 수 있습니다.

테마를 정의하고 android:typeface속성을 사용하려는 서체로 설정하십시오 styles.xml.

<resources>

    <!-- custom normal activity theme -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!-- other elements -->
        <item name="android:typeface">monospace</item>
    </style>

</resources>

AndroidManifest.xml파일 의 전체 앱에 테마를 적용 하십시오.

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application
        android:theme="@style/AppTheme" >
    </application>
</manifest>

안드로이드 참조


가볍고 구현하기 쉬운이 라이브러리를 사용해보십시오.

https://github.com/sunnag7/FontStyler

<com.sunnag.fontstyler.FontStylerView
              android:textStyle="bold"
              android:text="@string/about_us"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:paddingTop="8dp"
              app:fontName="Lato-Bold"
              android:textSize="18sp"
              android:id="@+id/textView64" />

대답은 '아니요'입니다. 전체 응용 프로그램에 대해 사용자 정의 글꼴을 설정할 수 있습니까?를 참조하십시오 . 자세한 내용은.

이 해결 방법이 있지만의 라인에서 아무것도 "여기에 코드 내 모든 글꼴의 하나 개의 라인은 없을 것 아닌 것을 ."

(Google 및 Apple에게 감사드립니다). 사용자 정의 글꼴은 위치가 있지만 앱을 쉽게 대체 할 수있게하면 Comic Sans 응용 프로그램 의 전 세계를 만들 수 있습니다 )

참고 URL : https://stackoverflow.com/questions/16404820/how-to-set-default-font-family-for-entire-android-app

반응형