2010-06-11 1 views
52

herehere 가이드에 따라 Android의 TextView에 사용자 지정 글꼴을 사용하려고합니다. 동일한 글꼴, 동일한 코드, 모든 것을 사용하면 logcat에 다음과 같이 표시됩니다.글꼴을로드 할 때 "RuntimeException : 기본 서체를 만들 수 없습니다"

W/dalvikvm( 317): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
E/AndroidRuntime( 317): FATAL EXCEPTION: main 
E/AndroidRuntime( 317): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.evilx.quacklock/org.evilx.quacklock.MainActivity}:    java.lang.RuntimeException: native typeface cannot be made 
E/AndroidRuntime( 317):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
E/AndroidRuntime( 317):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
E/AndroidRuntime( 317):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 317):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
E/AndroidRuntime( 317):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 317):  at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime( 317):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime( 317):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
E/AndroidRuntime( 317):  at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime( 317): Caused by: java.lang.RuntimeException: native typeface cannot be made 
E/AndroidRuntime( 317):  at android.graphics.Typeface.<init>(Typeface.java:147) 
E/AndroidRuntime( 317):  at android.graphics.Typeface.createFromAsset(Typeface.java:121) 
E/AndroidRuntime( 317):  at org.evilx.quacklock.MainActivity.onCreate(MainActivity.java:24) 
E/AndroidRuntime( 317):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
E/AndroidRuntime( 317):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
E/AndroidRuntime( 317):  ... 11 more 
W/ActivityManager( 59): Force finishing activity org.evilx.quacklock/.MainActivity 
W/ActivityManager( 59): Activity pause timeout for HistoryRecord{43e80368 org.evilx.quacklock/.MainActivity} 
D/dalvikvm( 247): GC_EXPLICIT freed 711 objects/53160 bytes in 20922ms 

흠 ... 좋습니다. 나는 블로그 중 하나에서 성공적으로 사용 된 글꼴 Molot.otf를 사용하고 있습니다. 또한 predator.ttf, 다른 사용자 정의 글꼴하지만, 트루 타입 형식을 사용하고

관련 코드 :이 원인이 될 것입니다 무엇

public class MainActivity extends Activity { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf"); 
      TextView tv = (TextView) findViewById(R.id.CustomFontText); 
      tv.setTypeface(tf); 
     } 
    } 

 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView 
     android:id="@+id/CustomFontText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30sp" 
     android:text="Here is some text."> 
     </TextView> 
</LinearLayout> 

? 그것은 블로그에있는 사람들을 위해 일 했으니 까, 왜 나야? API에서 중요한 변경 사항이 발생했기 때문에이를 방지 할 수 없었습니까?

+6

이 오류가 발생하여 그 의미가 궁금했을 때 알아 냈습니다. **로드 할 파일을 찾을 수 없기 때문에 발생했습니다 **. 비록 내가 읽지도 않은이 게시물과 관련이 없을 수도 있지만,이 오류를 검색하는 Google의 유일한 결과이기 때문에 여기에 게시하므로 어쨌든 주목할만한 가치가 있다고 생각합니다. –

+1

나는 그것이 내 상황의 문제라고 생각하지만 확실하지 않다. 나는 땜질을 많이하면서 끝내 버렸고 어떻게 든 작동하도록했다. – TheLQ

+2

분명히 안드로이드는 폰트 파일 이름이 폰트의 (임베디드) 이름과 일치하지 않는 상황을 좋아하지 않는다. 단순히 ttf 파일의 이름을 변경 한 후에도 똑같은 예외가 발생했습니다. – mvds

답변

44

Android는 OpenType (OTF), TrueType (TTF) 만 지원하므로, Molot.otf 글꼴이 제대로 작동하지 않을 수 있습니다. 나는 귀하가 귀하의 첫 문장에 링크 한 두 개의 블로그 게시물을 작성했습니다 (하나는 다른 사람의 불법 복제물입니다). 그리고 그들은 Molot.otf을 사용하지 않습니다.

(BTW, 나는 그 게시물의 형식을 약간 수정했습니다. AndroidGuys는 WordPress 호스트를 계속 변경하므로 이전 게시물은 형식이 크게 달라졌습니다).

EDIT : 의견에 명시된 바와 같이 Android DOES은 이제 OTF를 지원합니다.

+1

하지만 왜 트루 타입 글꼴이 실패 할까? TTF의 다른 유형이 있습니까? – TheLQ

+1

@ Lord.Quackstar : 죄송합니다. 트루 타입 글꼴이 잘 작동한다고 생각했습니다. 블로그 게시물에서 알 수 있듯이 Android는 모든 글꼴을 좋아하지 않습니다. 이전에는 조용한 실패 였지만 2 년 전이었습니다. 아마도 지금은 충돌 할 것입니다. 또한 글꼴이 저작물 영역에 명시된 디렉토리에 있는지 확인하십시오. 요즘에는 파일 시스템에서 폰트를로드 할 수 있습니다. 정적'createFromFile()'메소드를보십시오. 그래서 시도해 볼 수 있습니다. 그 게시물에 사용 된 HandmadeTypewriter 글꼴을 다운로드 할 수 있습니다. 그 글꼴이 작동한다는 것을 알고 있기 때문에, 그 글꼴이 사용자에게 적합하지 않은 경우, 글꼴이 아니라 사용자 환경과 다른 것입니다. – CommonsWare

+0

HandmadeTypewriter 및 자산 디렉토리를 모두 나열하는 것으로 발견 된 별도의 프로그램이 실패했습니다. 현재 2.1로 다운 그레이드. 감사합니다 – TheLQ

26

나는 또한 동일한 오류가 발생하고 해결책을 찾았습니다.

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf") 

당신은 당신의 이클립스에 assets/fonts 폴더에 fonts/Molot.otf을 넣어해야합니다.

실행할 수 있습니다. 서체가 실수를 할 수없는

당신이 당신이 불행하게도

+1

내 문제는 오타 였지만이 대답은 알아내는 데 도움이되었다. –

+0

"네이티브 서체를 만들 수 없습니다"라는 동일한 오류가 있었으며 오타였습니다. "fonts/font.otf"대신 "/fonts/font.otf"에서 글꼴에 액세스하려고했습니다. – speedynomads

9

를 통해 proplem을 보낼 수 성공적인 실행 할 수없는 경우는, 매우 구체적인하지이며, 그것은 잘못된가는 많은 것들의 결과 일 수있다. 다음 두 가지 사항을 확인하는 것이 중요합니다.

  • 가장 중요하고 중요한 사항 : 파일을 찾았습니다!
  • 글꼴이 장치에서 유효합니다.

가장 좋은 방법은 알려진 유효한 글꼴 파일의 글꼴 파일을 변경하는 것입니다.
실패하면 첫 번째 문제입니다.
그렇지 않은 경우 두 번째이므로 FontForge을 처리하거나 다른 글꼴을 찾아야합니다.

+1

감사합니다. mamuso, 이것이 내 문제였습니다. 파일 이름에 오타가 있었는데 ... –

5

참고하시기 바랍니다. 충돌에 대한 내 이유는 Eclipse에 의한 몇 가지 이유입니다. 내가 한 일은 프로젝트를 정리하고 다시 실행 한 것뿐입니다.

첫 번째로 필자는 테스트 프로젝트에서 사용자 지정 글꼴을 사용하여 몇 가지 새로운 기능을 시도했습니다. 처음 시작했습니다. 하지만 위와 같이 할 때까지 작업중인 프로젝트에서 작동하지 않았습니다.

가능한 한 많은 방법을 시도하십시오.

8

체크 폰트의 이름과 확장자. 대소 문자를 구분하면 &입니다. 예.

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF") 
3

'Fontlab'Software로 이진 모드에서 글꼴을 편집해야합니다.

3

그의 대답은 "나를 위해 일한 @deng :...

체크 글꼴의 이름과 확장자는 예를 들어, 대소 문자를 구분 & 아마 모두 대문자입니다

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/MOLOT.OTF") 
1

안드로이드 경우, 서체에 대한 OTF 파일을 지원합니다 이 문제가 발생하면 글꼴의 올바른 경로를 설정했는지 확인하십시오 (예 : fontname.otf 파일이있는 경우 글꼴 폴더의 에셋 폴더에 넣고 다음과 같이 글꼴을 만듭니다.

).
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/fontname.otf"); 

(경로 인수가 "/"로 시작하지 않아야합니다.) 파일 이름에 특수 문자 또는 "-"가 포함되어서는 안되며 소문자 여야합니다.

관련 문제