(#7) 전체 글꼴 네이버 나눔 폰트로 교체하기

일반 적으로 다음과 같이 부분적으로 폰트를 바꾸는 경우가 있습니다.

Typeface tf = Typeface.createFromAsset( getAssets() , "nanumfont.otf" );
textview.setTypeface(tf);

폰트의 경우 기기마다 다른데 잘못하면 기기에서 지원하지 않는 폰트를 사용할 경우 에러를 뱉으면서 셀폰이 죽는 경우가 있습니다. ( 유의하셔서 사용해야합니다.)

저는 전체 폰트를 나눔고딕으로 바꾸고 싶기 때문에 다음과 같이 하였습니다.

폰트를 네이버에서 검색하면 바로 다운 받으실 수 있습니다. 라이센스 또한 명확하게 나와있습니다.

전체 변경 하기 위해서 다음과 같이 클래스를 만들어줍니다. 이는 기본 시스템에서 제공하는 포트를 자바의 reflection을 이용하여 변경하는 방법입니다.

/**
* Application에서 전역으로 쓰기위해서 Font Override할 클래스
*/
public class FontOverride {

/** 기본 폰트 셋팅 */
public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
replaceFont(staticTypefaceFieldName, regular);
}

/** 기존의 폰트에서 설정한 폰트로 설정 */
protected 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();
}
}

}

다음과 같이 클래스를 만들어줬으면 이제 전역에다가 적용시켜줘야겠죠? 앱 전역에 적용시키기위해서는 Application을 상속받아야하는것이고 여기서 폰트 체인지를 해줍니다.

public class Application extends android.app.Application {

@Override
public void onCreate() {
super.onCreate();

/** 나눔 폰트를 기본으로 설정한다 */
FontOverride.setDefaultFont(this, "monospace", "nanumfont.otf");
}
}

당연히 Application을 상속받았으니 이를 Manifest에다가 이 앱에서 바라보는 애플리케이션은 이 클래스다라는 것을 명시해줘야합니다.

android:name=".Application"

<application />안에 추가해주시면 됩니다.

그리고 스타일을 적용해줘야합니다.

<style name="AppTheme.NoActionBar">
<item name="android:typeface">monospace</item>
</style>

다음과 같이 나는 이 글꼴을 사용할 것이고 전체 스타일은 이 글꼴을 사용하게 할것이다 라는 것을 명시해주는 부분입니다. 요새는 대부분 테마를 이용하여 스타일을 쉽게 바꿀 수 있는 것 같습니다. 예를들어 사계절 애플리케이션을 만들고 싶다 하시면 스타일을 4개로 만들어주시고 manifest에서 이름만 바꿔주시면 바로 적용 되겠습니다.

구체적인 스타일 설정방법 toolbar, subtitle, title, colorprimary, color등등 엄청나게 많은 속성과 값들이 존재하는데 이러한 것은 구글 공식 홈페이지를 참조하시면 됩니다. 또 API 버전에 따라 다르니 유의하셔야합니다.