전체 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>
대답은 '예'입니다.
글로벌 로봇 조명 TextView
및 Button
클래스 :
<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가 출시되면 지원 라이브러리를 사용하여이 목표를 달성 할 수 있습니다.
- 지원 라이브러리 > = 26.0.0 이있는 경우 앱 build.gradle을 확인하십시오.
- 리소스 폴더에 " font "폴더를 추가하고 거기에 글꼴을 추가하십시오
앱 기본 스타일에서 기본 글꼴 모음을 참조하십시오.
<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의 글꼴
앱 글꼴을 변경하려면 다음 단계를 따르십시오.
res
디렉토리 안에 새 디렉토리를 만들고 호출합니다font
.- 서체 폴더 안에 서체 .ttf / .otf를 삽입하십시오. 서체 이름은 소문자와 밑줄 만 사용해야합니다.
- 내부
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
'Programing' 카테고리의 다른 글
파이썬 들여 쓰기를 수정하는 방법 (0) | 2020.04.05 |
---|---|
풀 : apply, apply_async 또는 map을 언제 사용합니까? (0) | 2020.04.05 |
힘내 체크 아웃 의미 더블 대시 (0) | 2020.04.05 |
환경이 수정 된 Python 하위 프로세스 / Popen (0) | 2020.04.05 |
UILabel에 줄 바꿈을 추가하는 방법? (0) | 2020.04.04 |