Android에서 TextView의 fontFamily를 변경하는 방법


739

따라서 android:fontFamilyAndroid에서 를 변경하고 싶지만 Android에서 사전 정의 된 글꼴이 표시되지 않습니다. 사전 정의 된 항목 중 하나를 어떻게 선택합니까? 실제로 TypeFace를 직접 정의 할 필요는 없지만 지금 필요한 것과는 다릅니다.

<TextView
    android:id="@+id/HeaderText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="52dp"
    android:gravity="center"
    android:text="CallerBlocker"
    android:textSize="40dp"
    android:fontFamily="Arial"
 />

내가 한 일이 실제로 작동하지 않는 것 같습니다! BTW android:fontFamily="Arial"는 바보 같은 시도였습니다!


이 링크를 확인하십시오 stackoverflow.com/questions/2376250/…
duggu

답변:


1660

android 4.1 / 4.2 / 5.0부터 다음 Roboto 글꼴 모음을 사용할 수 있습니다.

android:fontFamily="sans-serif"           // roboto regular
android:fontFamily="sans-serif-light"     // roboto light
android:fontFamily="sans-serif-condensed" // roboto condensed
android:fontFamily="sans-serif-black"     // roboto black
android:fontFamily="sans-serif-thin"      // roboto thin (android 4.2)
android:fontFamily="sans-serif-medium"    // roboto medium (android 5.0)

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

와 함께

android:textStyle="normal|bold|italic"

이 16 가지 변형이 가능합니다.

  • 로보 토 레귤러
  • 로봇 이탤릭
  • 로봇 대담
  • 로봇 굵은 이탤릭체
  • 로봇 라이트
  • 로봇 라이트 이탤릭
  • 로봇 얇은
  • 로봇-얇은 이탤릭체
  • 로봇 응축
  • 로봇이 응축 된 이탤릭체
  • 로봇이 응축 된 굵은 체
  • 로봇이 응축 된 굵은 이탤릭체
  • 로봇-블랙
  • 로봇-블랙 이탤릭체
  • 로봇 매체
  • 로봇-중간 이탤릭체

fonts.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="font_family_light">sans-serif-light</string>
    <string name="font_family_medium">sans-serif-medium</string>
    <string name="font_family_regular">sans-serif</string>
    <string name="font_family_condensed">sans-serif-condensed</string>
    <string name="font_family_black">sans-serif-black</string>
    <string name="font_family_thin">sans-serif-thin</string>
</resources>

17
이것을 잊지 마세요 : android : fontFamily = "sans-serif-thin"// roboto thin
Sam Lu

6
roboto 표본 책 에서 "검은 색 작은 모자"라는 변형을 보았지만 사용할 수는 없습니다. 사용이 android:fontFamily="sans-serif-black-small-caps"작동하지 않습니다. 누군가 알고 있습니까?
tbruyelle

3
여기에 입력 한 글꼴 모음을 찾을 수 없습니다. "sans-serif"를 함께 찾을 수 없습니다.
Monty

9
이것은 좋은 목록입니다. 누구 든지이 정보의 출처에 대한 링크가 있습니까? android:fontFamilyTextView 에 대한 문서와 같이 Google이 쉽게 찾을 수있는 장소에서 문서 에이 정보가 있으면 좋을 것 입니다.
Christopher Perry

8
결정된 글꼴 목록은 여기
Newtonx

207

프로그래밍 방식으로 글꼴을 설정하는 방법입니다.

TextView tv = (TextView) findViewById(R.id.appname);
Typeface face = Typeface.createFromAsset(getAssets(),
            "fonts/epimodem.ttf");
tv.setTypeface(face);

글꼴 파일을 자산 폴더에 넣으십시오. 필자의 경우 fonts라는 하위 디렉토리를 만들었습니다.

편집 : 자산 폴더가 어디에 있는지 궁금하면 이 질문을 참조하십시오


34
이것이 작동하는 동안 메모리 누수가 발생할 수 있습니다 . 이 답변을 사용하여 수정할 수 있습니다 .
Charles Madere

@ScootrNova 솔루션을 사용할 때이 오류가 발생합니다. 오류 : 글꼴 자산을 찾을 수 없음 gothic.ttf
Sagar Devanga

이것을 전체 앱에 적용하는 방법은 무엇입니까? 예를 들어, 당신은 textview에만 적용됩니다
Pritish Joshi

176

Android-Studio 3.0 에서 시작 매우 쉽게 글꼴 모음을 변경할 수 있습니다.

지원 라이브러리 26을 사용하면 Android API 버전 16 이상을 실행하는 장치에서 작동합니다.

디렉토리 font아래 에 폴더를 만듭니다. res원하는 글꼴을 다운로드하여 폴더 에 붙여 넣습니다 font. 구조는 아래와 같은 것이어야합니다.

여기

노트 : Android Support Library 26.0부터 Api 26 이하를 실행하는 기기에서 글꼴이로드되도록 두 속성 세트 (android : 및 app :)를 모두 선언해야합니다.

이제 레이아웃을 사용하여 글꼴을 변경할 수 있습니다

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

프로그래밍 방식으로 변경하려면

 Typeface typeface = getResources().getFont(R.font.myfont);
   //or to support all versions use
Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);
 textView.setTypeface(typeface);  

styles.xml을 사용하여 글꼴을 변경하려면 스타일을 작성하십시오.

 <style name="Regular">
        <item name="android:fontFamily">@font/dancing_script</item>
        <item name="fontFamily">@font/dancing_script</item>
        <item name="android:textStyle">normal</item>
 </style>

이 스타일을 적용 TextView

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@style/Regular"/>

당신은 또한 자신의 글꼴 패밀리를 만들 수 있습니다

- 글꼴 폴더를 마우스 오른쪽 단추로 클릭하고 새로 작성> 글꼴 자원 파일 로 이동 하십시오 . 새 리소스 파일 창이 나타납니다.

- 파일 이름을 입력 한 다음 확인 을 클릭하십시오 . 새 글꼴 리소스 XML이 편집기에서 열립니다.

예를 들어 여기에 자신의 글꼴 모음을 작성하십시오.

<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>

이것은 단순히 특정 fontStyle 및 fontWeight를 해당 특정 변형을 렌더링하는 데 사용되는 글꼴 리소스에 매핑하는 것입니다. fontStyle의 유효한 값은 정상 또는 기울임 꼴입니다. fontWeight는 CSS 글꼴 가중치 사양을 준수합니다.

1. 레이아웃 에서 fontfamily 를 변경 하려면 다음을 작성할 수 있습니다.

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

2. 프로그래밍 방식으로 변경

 Typeface typeface = getResources().getFont(R.font.lobster);
   //or to support all versions use
Typeface typeface = ResourcesCompat.getFont(context, R.font.lobster);
 textView.setTypeface(typeface);  

전체 앱의 글꼴변경 하려면 AppTheme에서이 두 줄을 추가하십시오.

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

자세한 내용은 설명서 , Android 사용자 정의 글꼴 자습서 를 참조하십시오.


7
주의 : 이것은 현재 Android Studio 3.0 Preview에서만 작동합니다. Android Studio 2.3.3에서는 작동하지 않았습니다. 누군가를 구하기를 바랍니다.
Tash Pemhiwa

2
그냥 할 수 없기 때문에 어떻게 조각 내에서 글꼴을 얻을 수 getResources()있습니까? 편집 : 귀하의 답변 Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);
Paradox

어쨌든 Caligtraphy와 비교하여 글꼴이 손상된 것처럼 보입니다. 또한 fontWeight는 아무것도하지 않습니다
Leo Droidcoder

이 작업을 수행 @LeoDroidcoder, 메이크업은 반드시 둘 다 사용 android:fontWeight하고app:fontWeight
Manohar 레디를

여러 번 확인했습니다. 효과가 없습니다.
레오 드로이드 코더

100

/system/etc/fonts.xml최근 프로젝트에서 파싱해야했습니다 . Lollipop의 현재 글꼴 모음은 다음과 같습니다.

╔════╦════════════════════════════╦═════════════════════════════╗
     FONT FAMILY                 TTF FILE                    
╠════╬════════════════════════════╬═════════════════════════════╣
  1  casual                      ComingSoon.ttf              
  2  cursive                     DancingScript-Regular.ttf   
  3  monospace                   DroidSansMono.ttf           
  4  sans-serif                  Roboto-Regular.ttf          
  5  sans-serif-black            Roboto-Black.ttf            
  6  sans-serif-condensed        RobotoCondensed-Regular.ttf 
  7  sans-serif-condensed-light  RobotoCondensed-Light.ttf   
  8  sans-serif-light            Roboto-Light.ttf            
  9  sans-serif-medium           Roboto-Medium.ttf           
 10  sans-serif-smallcaps        CarroisGothicSC-Regular.ttf 
 11  sans-serif-thin             Roboto-Thin.ttf             
 12  serif                       NotoSerif-Regular.ttf       
 13  serif-monospace             CutiveMono.ttf              
╚════╩════════════════════════════╩═════════════════════════════╝

다음은 파서입니다 ( FontListParser 기반 ).

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Xml;

/**
 * Helper class to get the current font families on an Android device.</p>
 * 
 * Usage:</p> {@code List<SystemFont> fonts = FontListParser.safelyGetSystemFonts();}</p>
 */
public final class FontListParser {

    private static final File FONTS_XML = new File("/system/etc/fonts.xml");

    private static final File SYSTEM_FONTS_XML = new File("/system/etc/system_fonts.xml");

    public static List<SystemFont> getSystemFonts() throws Exception {
        String fontsXml;
        if (FONTS_XML.exists()) {
            fontsXml = FONTS_XML.getAbsolutePath();
        } else if (SYSTEM_FONTS_XML.exists()) {
            fontsXml = SYSTEM_FONTS_XML.getAbsolutePath();
        } else {
            throw new RuntimeException("fonts.xml does not exist on this system");
        }
        Config parser = parse(new FileInputStream(fontsXml));
        List<SystemFont> fonts = new ArrayList<>();

        for (Family family : parser.families) {
            if (family.name != null) {
                Font font = null;
                for (Font f : family.fonts) {
                    font = f;
                    if (f.weight == 400) {
                        break;
                    }
                }
                SystemFont systemFont = new SystemFont(family.name, font.fontName);
                if (fonts.contains(systemFont)) {
                    continue;
                }
                fonts.add(new SystemFont(family.name, font.fontName));
            }
        }

        for (Alias alias : parser.aliases) {
            if (alias.name == null || alias.toName == null || alias.weight == 0) {
                continue;
            }
            for (Family family : parser.families) {
                if (family.name == null || !family.name.equals(alias.toName)) {
                    continue;
                }
                for (Font font : family.fonts) {
                    if (font.weight == alias.weight) {
                        fonts.add(new SystemFont(alias.name, font.fontName));
                        break;
                    }
                }
            }
        }

        if (fonts.isEmpty()) {
            throw new Exception("No system fonts found.");
        }

        Collections.sort(fonts, new Comparator<SystemFont>() {

            @Override
            public int compare(SystemFont font1, SystemFont font2) {
                return font1.name.compareToIgnoreCase(font2.name);
            }

        });

        return fonts;
    }

    public static List<SystemFont> safelyGetSystemFonts() {
        try {
            return getSystemFonts();
        } catch (Exception e) {
            String[][] defaultSystemFonts = {
                    {
                            "cursive", "DancingScript-Regular.ttf"
                    }, {
                            "monospace", "DroidSansMono.ttf"
                    }, {
                            "sans-serif", "Roboto-Regular.ttf"
                    }, {
                            "sans-serif-light", "Roboto-Light.ttf"
                    }, {
                            "sans-serif-medium", "Roboto-Medium.ttf"
                    }, {
                            "sans-serif-black", "Roboto-Black.ttf"
                    }, {
                            "sans-serif-condensed", "RobotoCondensed-Regular.ttf"
                    }, {
                            "sans-serif-thin", "Roboto-Thin.ttf"
                    }, {
                            "serif", "NotoSerif-Regular.ttf"
                    }
            };
            List<SystemFont> fonts = new ArrayList<>();
            for (String[] names : defaultSystemFonts) {
                File file = new File("/system/fonts", names[1]);
                if (file.exists()) {
                    fonts.add(new SystemFont(names[0], file.getAbsolutePath()));
                }
            }
            return fonts;
        }
    }

    /* Parse fallback list (no names) */
    public static Config parse(InputStream in) throws XmlPullParserException, IOException {
        try {
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(in, null);
            parser.nextTag();
            return readFamilies(parser);
        } finally {
            in.close();
        }
    }

    private static Alias readAlias(XmlPullParser parser) throws XmlPullParserException, IOException {
        Alias alias = new Alias();
        alias.name = parser.getAttributeValue(null, "name");
        alias.toName = parser.getAttributeValue(null, "to");
        String weightStr = parser.getAttributeValue(null, "weight");
        if (weightStr == null) {
            alias.weight = 0;
        } else {
            alias.weight = Integer.parseInt(weightStr);
        }
        skip(parser); // alias tag is empty, ignore any contents and consume end tag
        return alias;
    }

    private static Config readFamilies(XmlPullParser parser) throws XmlPullParserException,
            IOException {
        Config config = new Config();
        parser.require(XmlPullParser.START_TAG, null, "familyset");
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            if (parser.getName().equals("family")) {
                config.families.add(readFamily(parser));
            } else if (parser.getName().equals("alias")) {
                config.aliases.add(readAlias(parser));
            } else {
                skip(parser);
            }
        }
        return config;
    }

    private static Family readFamily(XmlPullParser parser) throws XmlPullParserException,
            IOException {
        String name = parser.getAttributeValue(null, "name");
        String lang = parser.getAttributeValue(null, "lang");
        String variant = parser.getAttributeValue(null, "variant");
        List<Font> fonts = new ArrayList<Font>();
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String tag = parser.getName();
            if (tag.equals("font")) {
                String weightStr = parser.getAttributeValue(null, "weight");
                int weight = weightStr == null ? 400 : Integer.parseInt(weightStr);
                boolean isItalic = "italic".equals(parser.getAttributeValue(null, "style"));
                String filename = parser.nextText();
                String fullFilename = "/system/fonts/" + filename;
                fonts.add(new Font(fullFilename, weight, isItalic));
            } else {
                skip(parser);
            }
        }
        return new Family(name, fonts, lang, variant);
    }

    private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
        int depth = 1;
        while (depth > 0) {
            switch (parser.next()) {
            case XmlPullParser.START_TAG:
                depth++;
                break;
            case XmlPullParser.END_TAG:
                depth--;
                break;
            }
        }
    }

    private FontListParser() {

    }

    public static class Alias {

        public String name;

        public String toName;

        public int weight;
    }

    public static class Config {

        public List<Alias> aliases;

        public List<Family> families;

        Config() {
            families = new ArrayList<Family>();
            aliases = new ArrayList<Alias>();
        }

    }

    public static class Family {

        public List<Font> fonts;

        public String lang;

        public String name;

        public String variant;

        public Family(String name, List<Font> fonts, String lang, String variant) {
            this.name = name;
            this.fonts = fonts;
            this.lang = lang;
            this.variant = variant;
        }

    }

    public static class Font {

        public String fontName;

        public boolean isItalic;

        public int weight;

        Font(String fontName, int weight, boolean isItalic) {
            this.fontName = fontName;
            this.weight = weight;
            this.isItalic = isItalic;
        }

    }

    public static class SystemFont {

        public String name;

        public String path;

        public SystemFont(String name, String path) {
            this.name = name;
            this.path = path;
        }

    }
}

프로젝트에서 위의 클래스를 자유롭게 사용하십시오. 예를 들어, 사용자에게 글꼴 모음을 선택하고 원하는대로 글꼴을 설정할 수 있습니다.

작은 불완전한 예 :

final List<FontListParser.SystemFont> fonts = FontListParser.safelyGetSystemFonts();
String[] items = new String[fonts.size()];
for (int i = 0; i < fonts.size(); i++) {
    items[i] = fonts.get(i).name;
}

new AlertDialog.Builder(this).setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        FontListParser.SystemFont selectedFont = fonts.get(which);
        // TODO: do something with the font
        Toast.makeText(getApplicationContext(), selectedFont.path, Toast.LENGTH_LONG).show();
    }
}).show();

어떤 Android 버전이 어떤 글꼴을 추가했는지 알고 있습니까?
안드로이드 개발자

@androiddeveloper하지 않습니다. : 당신은 아마 여기에 변경 사항을 확인하여 알아낼 수 github.com/android/platform_frameworks_base/blob/...
자레드 Rummler을

@JaredRummler, 내 무지를 용서하십시오. 왜 / 무게 == 400입니까?
사무엘

1
@Samuel이 코드를 한동안 보지 못했지만 "보통"또는 "일반"글꼴에 400 개의 글꼴 가중치가 사용됩니다. 예를 들어 Roboto-Regular의 무게는 400입니다.
Jared Rummler

루트 또는 무언가가 필요합니까? 이 코드를 Android 에뮬레이터 (버전 8.1) getSystemFonts()org.xmlpull.v1.XmlPullParserException: END_TAG expected (position:START_TAG (empty) <axis tag='wdth' stylevalue='100.0'>@219:51 in java.io.InputStreamReader@f001fb3)
Damn Vegetables

49

Android에서는 XML 레이아웃에서 맞춤 글꼴을 설정할 수 없습니다. 대신 앱의 자산 폴더에 특정 글꼴 파일을 묶고 프로그래밍 방식으로 설정해야합니다. 다음과 같은 것 :

TextView textView = (TextView) findViewById(<your TextView ID>);
Typeface typeFace = Typeface.createFromAsset(getAssets(), "<file name>");
textView.setTypeface(typeFace);

setContentView ()가 호출 된 후에 만이 코드를 실행할 수 있습니다. 또한 일부 글꼴 만 Android에서 지원되며 .ttf (TrueType)또는 .otf (OpenType)형식 이어야 합니다. 그래도 일부 글꼴이 작동하지 않을 수 있습니다.

글꼴은 Android에서 확실히 작동하는 글꼴이며 글꼴 파일이 Android에서 지원되지 않는 경우이 코드를 사용하여 코드가 작동하는지 확인할 수 있습니다.

Android O 업데이트 : Roger의 의견에 따라 Android O의 XML에서 가능합니다 .


"Android에서는 XML 레이아웃에서 사용자 정의 글꼴을 설정할 수 없습니다." 이것은 Android O에서 변경되었으며,이를 통해 사용자 정의 글꼴 모음을 만들고 XML로 적용 할 수 있습니다. developer.android.com/preview/features/working-with-fonts.html
Roger Huang

27

프로그래밍 방식으로 Roboto를 설정하려면 :

paint.setTypeface(Typeface.create("sans-serif-thin", Typeface.NORMAL));

25

와 동일합니다 android:typeface.

내장 글꼴은 다음과 같습니다.

  • 표준
  • 산세
  • 가는 장식 선
  • 단일 공간

android : typeface를 참조하십시오 .


4
나는 그것이 같은 것이라고 생각하지 않지만 우리가 둘 다 사용할 수없는 것으로 보입니다. 에 매핑 된 속성이 3 개 이상인 것 같습니다 setTypeface(). 즉 fontFamily, typefacetextStyle. 그러나 나는 필자의 삶을 위해 구체적인 Typeface 인스턴스를 해결하기 위해 이것이 어떻게 정확하게 결합되는지 알아낼 수 없다. 누구든지 이것을 알아 냈습니까? Google의 문서는 도움이되지 않습니다 ...
Rad Haring


15

Chris Jenx의 훌륭한 라이브러리 서예 를 사용하여 Android 응용 프로그램에서 사용자 정의 글꼴을 사용할 수 있습니다. 시도 해봐!


예, 그러나 예를 들어 나는 그것을 functionanl 사용하고 싶지만 모든 라이브러리를 구현하고 싶지
Morozov

12

당신이 원하는 것은 불가능합니다. TypeFace강령에서 설정해야합니다 .

에서 XML당신이 할 수있는 일이

android:typeface="sans" | "serif" | "monospace"

다른 경우에는 Fonts in XML로 많은 것을 재생할 수 없습니다. :)

들어 Arial당신은 당신의 코드에서 형의 얼굴을 설정해야합니다.


11

글꼴을 관리하는 쉬운 방법은 다음과 같이 리소스를 통해 글꼴을 선언하는 것입니다.

<!--++++++++++++++++++++++++++-->
<!--added on API 16 (JB - 4.1)-->
<!--++++++++++++++++++++++++++-->
<!--the default font-->
<string name="fontFamily__roboto_regular">sans-serif</string>
<string name="fontFamily__roboto_light">sans-serif-light</string>
<string name="fontFamily__roboto_condensed">sans-serif-condensed</string>

<!--+++++++++++++++++++++++++++++-->
<!--added on API 17 (JBMR1 - 4.2)-->
<!--+++++++++++++++++++++++++++++-->
<string name="fontFamily__roboto_thin">sans-serif-thin</string>

<!--+++++++++++++++++++++++++++-->
<!--added on Lollipop (LL- 5.0)-->
<!--+++++++++++++++++++++++++++-->
<string name="fontFamily__roboto_medium">sans-serif-medium</string>
<string name="fontFamily__roboto_black">sans-serif-black</string>
<string name="fontFamily__roboto_condensed_light">sans-serif-condensed-light</string>

이것은 여기여기에 소스 코드를 기반으로합니다


어디에 선언해야합니까?
AZ_

@AZ_ 많은 리소스 파일과 마찬가지로 "res / values ​​/"폴더 안에 원하는 XML 파일로 넣을 수 있습니다. 예를 들어, "res / values ​​/ fonts.xml"에 넣으십시오. 안드로이드 : : 그리고, 그것을 사용하는, 간단하게 예를 들어 다음과 같이 수행의 font = "문자열 / fontFamily__roboto_regular"
안드로이드 개발자

덕분에, 나는이 사용하고 github.com/norbsoft/android-typeface-helper을 하고 정말 도움이
AZ_

좋아, 라이브러리는 아마도 프로그래밍 방식으로 수행하기위한 것일 것입니다. 여기는 XML을위한 것입니다
안드로이드 개발자

9

동적으로 당신은 이것을 사용하여 xml에서 android : fontFamily와 비슷한 fontfamily를 설정할 수 있습니다.

For Custom font:

 TextView tv = ((TextView) v.findViewById(R.id.select_item_title));
 Typeface face=Typeface.createFromAsset(getAssets(),"fonts/mycustomfont.ttf"); 
 tv.setTypeface(face);

For Default font:

 tv.setTypeface(Typeface.create("sans-serif-medium",Typeface.NORMAL));

다음은 사용 된 기본 글꼴 모음 입니다. 큰 따옴표 문자열 "sans-serif-medium"을 바꾸어이 중 하나를 사용하십시오.

FONT FAMILY                    TTF FILE                    

1  casual                      ComingSoon.ttf              
2  cursive                     DancingScript-Regular.ttf   
3  monospace                   DroidSansMono.ttf           
4  sans-serif                  Roboto-Regular.ttf          
5  sans-serif-black            Roboto-Black.ttf            
6  sans-serif-condensed        RobotoCondensed-Regular.ttf 
7  sans-serif-condensed-light  RobotoCondensed-Light.ttf   
8  sans-serif-light            Roboto-Light.ttf            
9  sans-serif-medium           Roboto-Medium.ttf           
10  sans-serif-smallcaps       CarroisGothicSC-Regular.ttf 
11  sans-serif-thin            Roboto-Thin.ttf             
12  serif                      NotoSerif-Regular.ttf       
13  serif-monospace            CutiveMono.ttf              

"mycustomfont.ttf"는 ttf 파일입니다. 경로src / assets / fonts / mycustomfont.ttf에 있으며,이 기본 글꼴 패밀리 에서 기본 글꼴에 대한 자세한 내용을 볼 수 있습니다


9
Typeface typeface = ResourcesCompat.getFont(context, R.font.font_name);
textView.setTypeface(typeface);

res> font 디렉토리에서 프로그래밍 방식으로 모든 텍스트보기로 쉽게 글꼴 설정


7

나는 너무 늦었다 고 생각하지만이 솔루션은 다른 사람들에게 도움이 될 수 있습니다. 사용자 정의 글꼴을 사용하려면 글꼴 파일을 글꼴 디렉토리에 넣으십시오.

textView.setTypeface(ResourcesCompat.getFont(this, R.font.lato));

6

시행 착오로 다음을 배웠습니다.

* .xml 내에서 스톡 글꼴을 서체뿐만 아니라 다음 기능과 결합 할 수 있습니다.

 android:fontFamily="serif" 
 android:textStyle="italic"

이 두 스타일을 사용하면 다른 경우에는 서체를 사용할 필요가 없었습니다. fontfamily & textStyle을 사용하면 조합 범위가 훨씬 더 커집니다.


5

android : fontFamily의 유효한 값은 /system/etc/system_fonts.xml(4.x) 또는 /system/etc/fonts.xml(5.x)에 정의되어 있습니다. 그러나 장치 제조업체가이를 수정할 수 있으므로 fontFamily 값을 설정하는 데 사용되는 실제 글꼴은 위에서 언급 한 지정된 장치의 파일에 따라 다릅니다.

AOSP에서 Arial 글꼴은 유효하지만 "Arial"이 아닌 "arial"을 사용하여 정의해야합니다 (예 : android : fontFamily = "arial") . Kitkat의 system_fonts.xml을 간략하게 살펴보십시오.

    <family>
    <nameset>
        <name>sans-serif</name>
        <name>arial</name>
        <name>helvetica</name>
        <name>tahoma</name>
        <name>verdana</name>
    </nameset>
    <fileset>
        <file>Roboto-Regular.ttf</file>
        <file>Roboto-Bold.ttf</file>
        <file>Roboto-Italic.ttf</file>
        <file>Roboto-BoldItalic.ttf</file>
    </fileset>
</family>

///////////////////////////////////////////////////////// //////////////////////////

레이아웃에서 "font"를 정의하기위한 세 가지 관련 xml 속성 인 android : fontFamily , android : typefaceandroid : textStyle이 있습니다. "fontFamily"및 "textStyle"또는 "fontface"및 "textStyle"의 조합을 사용하여 텍스트의 글꼴 모양을 변경할 수 있으므로 단독으로 사용됩니다. TextView.java의 코드 스 니펫은 다음 과 같습니다.

    private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) {
    Typeface tf = null;
    if (familyName != null) {
        tf = Typeface.create(familyName, styleIndex);
        if (tf != null) {
            setTypeface(tf);
            return;
        }
    }
    switch (typefaceIndex) {
        case SANS:
            tf = Typeface.SANS_SERIF;
            break;

        case SERIF:
            tf = Typeface.SERIF;
            break;

        case MONOSPACE:
            tf = Typeface.MONOSPACE;
            break;
    }
    setTypeface(tf, styleIndex);
}


    public void setTypeface(Typeface tf, int style) {
    if (style > 0) {
        if (tf == null) {
            tf = Typeface.defaultFromStyle(style);
        } else {
            tf = Typeface.create(tf, style);
        }

        setTypeface(tf);
        // now compute what (if any) algorithmic styling is needed
        int typefaceStyle = tf != null ? tf.getStyle() : 0;
        int need = style & ~typefaceStyle;
        mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
        mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
    } else {
        mTextPaint.setFakeBoldText(false);
        mTextPaint.setTextSkewX(0);
        setTypeface(tf);
    }
}

코드에서 우리는 볼 수 있습니다 :

  1. "fontFamily"가 설정되어 있으면 "서체"가 무시됩니다.
  2. "서체"에는 표준 값과 제한된 유효 값이 있습니다. 실제로 값은 "normal" "sans" "serif"및 "monospace"이며 system_fonts.xml (4.x) 또는 fonts.xml (5.x)에서 찾을 수 있습니다. 실제로 "normal"과 "sans"는 시스템의 기본 글꼴입니다.
  3. "fontFamily"는 빌트인 글꼴의 모든 글꼴을 설정하는 데 사용될 수 있지만 "글꼴"은 "sans-serif" "serif"및 "monospace"(전 세계 글꼴 유형의 세 가지 주요 범주)의 일반적인 글꼴 만 제공합니다. .
  4. "textStyle"만 설정하면 실제로 기본 글꼴과 지정된 스타일이 설정됩니다. 유효 값은 "normal" "bold" "italic"및 "bold | italic"입니다.

4

여기입니다 쉽게 워싱턴 경우에 사용할 수 있습니다 Y. 원칙은 XML 레이아웃에 보이지 않는 TextVview를 추가 하고 Java 코드에서 typeFace얻는 것 입니다.

xml 파일의 레이아웃 :

 <TextView
        android:text="The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty. The classic bread is made of flour hot and salty."
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:fontFamily="sans-serif-thin"
        android:id="@+id/textViewDescription"/>

그리고 자바 코드 :

myText.setTypeface(textViewSelectedDescription.getTypeface());

그것은 나를 위해 일했습니다 (예 : TextSwitcher 내에서).


4

이 시도:

TextView textview = (TextView) findViewById(R.id.textview);

Typeface tf= Typeface.createFromAsset(getAssets(),"fonts/Tahoma.ttf");
textview .setTypeface(tf);

4

아래와 같이 res 디렉토리 아래에 글꼴 폴더를 추가하여이 작업을 수행 할 수도 있습니다.

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

그런 다음 자원 유형으로 글꼴을 선택하십시오. 여기에 이미지 설명을 입력하십시오

https://www.1001fonts.com/ 에서 사용 가능한 글꼴을 찾은 다음이 글꼴 디렉토리에 TTF 파일을 추출 할 수 있습니다 .

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

마지막으로 android : fontFamily : "@ font / urfontfilename"을 추가하여 textview가 포함 된 XML 파일을 변경하십시오.

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


매우 감사합니다. 감사합니다. 다른 사람들이 더 많은 별을 가지고 있지만 물질 디자인 텍스트보기로 작동하는 것으로 확인 된 이유는 무엇입니까? app:fontFamily=그러나 다른 모든 것은 동일합니다.
EvOlaNdLuPiZ

YOu는 내 생명을 구했습니다. 방금 font라는 폴더를 만들었고 작동하지 않았습니다. 어쨌든 나는 당신의 길을 사용했고 효과가있었습니다. 감사합니다
Hilal

4

간단한 방법 중 하나 는 프로젝트에 원하는 글꼴 을 추가하는 것 입니다.

이동 파일 -> 새로 만들기 -> 새 리소스 디렉토리 를 선택 글꼴

리소스에 새 디렉토리 font 가 생성 됩니다.

글꼴 (.ttf)을 다운로드하십시오 . 내가 사용 https://fonts.google.com을 동일위한

글꼴 폴더에 추가 한 다음 XML에서 또는 프로그래밍 방식으로 사용하십시오.

XML-

<TextView 
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/your_font"/>

프로그래밍 방식으로-

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

9
더 나은 사용 ResourcesCompat.getFont방법
Vadim Kotov

3
<string name="font_family_display_4_material">sans-serif-light</string>
<string name="font_family_display_3_material">sans-serif</string>
<string name="font_family_display_2_material">sans-serif</string>
<string name="font_family_display_1_material">sans-serif</string>
<string name="font_family_headline_material">sans-serif</string>
<string name="font_family_title_material">sans-serif-medium</string>
<string name="font_family_subhead_material">sans-serif</string>
<string name="font_family_menu_material">sans-serif</string>
<string name="font_family_body_2_material">sans-serif-medium</string>
<string name="font_family_body_1_material">sans-serif</string>
<string name="font_family_caption_material">sans-serif</string>
<string name="font_family_button_material">sans-serif-medium</string>

3

동일한 글꼴 군을 가진 여러 곳에서 TextView를 사용하려면 TextView 클래스를 확장하고 다음과 같이 글꼴을 설정하십시오.

public class ProximaNovaTextView extends TextView {

    public ProximaNovaTextView(Context context) {
        super(context);

        applyCustomFont(context);
    }

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

        applyCustomFont(context);
    }

    public ProximaNovaTextView(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);

       applyCustomFont(context);
    } 

    private void applyCustomFont(Context context) {
        Typeface customFont = FontCache.getTypeface("proximanova_regular.otf", context);
        setTypeface(customFont);
    }
}

그런 다음 TextView에 대해이 사용자 정의 클래스를 xml로 사용하십시오.

   <com.myapp.customview.ProximaNovaTextView
        android:id="@+id/feed_list_item_name_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        />

3

Android Studio 3.5 이상을 사용하는 경우 글꼴 변경이 매우 간단합니다. 디자인보기에서 텍스트 위젯을 선택하고 속성 창에서 fontFamily를 확인하십시오. 값 드롭 다운에는 사용 가능한 모든 글꼴 중 하나를 선택할 수 있습니다. Google 글꼴을 찾으려면 추가 글꼴 옵션을 클릭하십시오.

속성 창 속성 창

구글 글꼴 구글 글꼴


2

나는 안드로이드에 글꼴이있는 지옥이 곧 끝날 것이라고 언급하고 싶습니다 .Google IO에서 올해 우리는 마침내 이것을 얻었습니다-> https://developer.android.com/preview/features/working-with-fonts. html

이제 새로운 리소스 유형의 글꼴이 있으며 문자열 res 값, drawable res 값 등에 액세스 할 수있는 것처럼 모든 응용 프로그램 글꼴을 res / fonts 폴더 안에 넣고 R.font.my_custom_font로 액세스 할 수 있습니다 . 서체 를 만들려면 xml 파일 사용자 정의 글꼴 (이탤릭체, 굵은 체 및 밑줄로 표시)을 설정하십시오.

자세한 내용은 위의 링크를 읽으십시오. 지원을 보자.


안타깝게도 여전히 IntelliJ에서 작동하지 않습니다 (Android Studio 3.0 이상에서 매력처럼 작동 함).
Dominikus K.

예, 그러나 Redman위의 사용자 답변은 여전히 ​​솔루션의 필수 부분입니다.
jungledev

2

사용할 수있는 멋진 라이브러리가 있습니다

    implementation 'uk.co.chrisjenx:calligraphy:2.3.0'

이 라이브러리는 전체 응용 프로그램에서 모든 뷰의 글꼴을 변경하는 데 사용됩니다. 목록보기와 같은 어댑터보기에는 적용되지 않습니다. 이를 위해 각 어댑터에 코드를 추가해야합니다.
Senthilvel S

2

새로운 폰트 자원을 직접 설정할 수 있습니다 font사용

android:fontFamily="@font/my_font_in_font_folder"

1

다음 res/layout/value/style.xml과 같이 스타일을 설정하십시오 .

<style name="boldText">
    <item name="android:textStyle">bold|italic</item>
    <item name="android:textColor">#FFFFFF</item>
</style>

main.xml파일 사용시이 스타일을 사용하려면 :

style="@style/boldText"

1

android-studio 3 이상에서는이 스타일을 사용 textView하고 앱에서 모든 글꼴을 변경할 수 있습니다.

당신의 스타일을 만들어보세요 style.xml:

<!--OverRide all textView font-->
<style name="defaultTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">@font/your_custom_font</item>
</style>

그런 다음 테마에서 사용하십시오.

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- 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:textViewStyle">@style/defaultTextViewStyle</item>
    </style>

1

프로그래밍 방식으로 글꼴을 TextView에 추가하는 가장 쉬운 방법 은 먼저 프로젝트의 Assets 폴더에 글꼴 파일을 추가하는 것입니다. 예를 들어 글꼴 경로는 다음과 같습니다.assets/fonts/my_font.otf

그리고 TextView에 다음과 같이 추가하십시오.

코 틀린

val font_path = "fonts/my_font.otf"  

myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)

textView.typeface = myTypeface

자바

String font_path = "fonts/my_font.otf";
Typeface myTypeface = Typeface.createFromAsset(MyApplication.getInstance().assets, font_path)
textView.setTypeface(myTypeface);

0

여기서 사용 가능한 모든 fontFamily 값과 해당 글꼴 파일 이름을 볼 수 있습니다 (이 파일은 Android 5.0 이상에서 사용 중임). 휴대 기기에서는 다음에서 찾을 수 있습니다.

/system/etc/fonts.xml(5.0 이상)

( 버전을 사용하는 Android 4.4 이하의 fonts.xml경우 더 명확한 형식이 있고 이해하기 쉽다고 생각합니다 .)

예를 들어

    <!-- first font is default -->
20    <family name="sans-serif">
21        <font weight="100" style="normal">Roboto-Thin.ttf</font>
22        <font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
23        <font weight="300" style="normal">Roboto-Light.ttf</font>
24        <font weight="300" style="italic">Roboto-LightItalic.ttf</font>
25        <font weight="400" style="normal">Roboto-Regular.ttf</font>
26        <font weight="400" style="italic">Roboto-Italic.ttf</font>
27        <font weight="500" style="normal">Roboto-Medium.ttf</font>
28        <font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
29        <font weight="900" style="normal">Roboto-Black.ttf</font>
30        <font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
31        <font weight="700" style="normal">Roboto-Bold.ttf</font>
32        <font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
33    </family>

tag 의 name 속성 name="sans-serif"familyandroid : fontFamily에서 사용할 수있는 값을 정의했습니다.

font태그는 맞습니다 글꼴 파일을 정의합니다.

이 경우 <!-- fallback fonts -->글꼴의 대체 논리에 사용 중인의 소스를 무시할 수 있습니다 .

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