ProgramingTip

일부 사람들에게만 "네이티브 서체를 만들 수 없습니다"

bestdevel 2020. 10. 20. 07:53
반응형

일부 사람들에게만 "네이티브 서체를 만들 수 없습니다"


일부 요소의 글꼴 서체를 변경하는 앱이 있습니다. 대부분의 사람들에게 잘 작동하지만 0.5 %는 예외가 발생합니다. 스택 추적의 중요한 부분은 다음과 가변적입니다.

Caused by: java.lang.RuntimeException: native typeface cannot be made
at android.graphics.Typeface.<init>(Typeface.java:147)
at android.graphics.Typeface.createFromAsset(Typeface.java:121)

내가 말했듯이 대부분의 사람들에게 작동 방식 글꼴 파일이나 내 코드에 문제가 있다고 생각하지 않습니다. 이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?

편집 :이 내 코드입니다.

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                                 "fonts/CharisSILR.ttf");
TextView tv;
tv = ((TextView) findViewById(R.id.searchPronunciationTitle));
tv.setTypeface(phoneticFont);

이 Android OS 버그가 문제의 원인 일 수 있습니다.

Typeface.createFromAsset에서 자산 유출 유출

이 버그 보고서의 해결 방법은 어디에 있습니까?

방법이 글꼴 경로 또는 형식을 가정하지 않도록 HTH의 해결 방법을 변경했습니다. 글꼴 자산의 전체 경로를 사용해야합니다. 또한 try-catch 블록에서 createFromAsset () 호출을 래핑하여 자산을 사용할 수없는 경우 get () 메서드가 null을 반환합니다.

public class Typefaces {
    private static final String TAG = "Typefaces";

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    Log.e(TAG, "Could not get typeface '" + assetPath
                            + "' because " + e.getMessage());
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}

나는 여기에서 몇 가지 해결책을 성공하지 않습니다. 프로그래머가 자주하는 것처럼 정말 모호한 생각했습니다. 그런 다음 내가 읽은 곳은 글꼴 경로와 관련이있을 수 있습니다.

대신에 :

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "blanch_caps.ttf");   

나는 다음과 같이 변경했습니다.

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/blanch_caps.ttf");   

내 파일은 자산 / 글꼴 / blanch_caps.ttf에 있습니다. 그것은 매력처럼 작동하지 않습니다!


이 오류는 글꼴이 라이브러리 자산 폴더에있을 때 발생했습니다. 이 라이브러리를 사용하는 응용 프로그램의 자산에 발생했을 때 오류가 사라졌습니다.

자산을 만들 수없는 것입니다. Android 라이브러리 자산 폴더가 복사되지 않습니다.

다음은 몇 가지 다른 경우입니다. 사용자 정의 글꼴 사용시 문제- "기본 서체를 만들 수 없음"


나는 이것으로 많은 어려움을 짓습니다. 나는 모든 가능성을 시도했지만 아무것도 도움이되지 않았습니다. 결국 문제는 다른 곳이었습니다. Gradle로 프로젝트를 빌드하는 경우 build.gradle 파일에 재설치하는 것을 잊지 마세요. 이 제 경우의 문제를 해결했습니다.

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}

당신은 내부 폴더 자산을 작성해야 SRC >- 주요 안드로이드 스튜디오한다. 이 방법이 작동했습니다!


제 경우에는 글꼴의 파일 이름을 기반으로했습니다. 어떤 M FontName..ttf로 명명되었습니다.

이중 점이 왜 거기에 있었는지 모르겠습니다. 원래 글꼴을 찾아 보니 windows \ fonts 폴더에 FontName..ttf라는 이름이 있습니다. Windows는 별다른 관심을 보여주고 있습니다. 파일 이름을 변경했는데 이제 모두 만족 스럽습니다.


제 경우에는 에셋 폴더가 /main/java/assets준비/main/assets


소문자로 수행 :

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/charissilr.ttf");

파일 이름도 변경해야합니다.


직원 변경

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/CharisSILR.ttf");

...에

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "CharisSILR.ttf");

qwerjk의 MagicTextView를 사용할 때 방금이 문제가 발생했습니다. MTV 클래스를 라이브러리에 다수 메인 프로젝트에서 사용했습니다. 작동 방법은 다음과 가변합니다.

  1. 주 프로젝트 자산 폴더에서 fonts라는 하위 폴더를 만듭니다.
  2. ttf 파일을 자산 / 글꼴 폴더에 복사하십시오. 내 파일 이름은 camelcase (예 : ReservoirGrunge.ttf) 였지만 대문자 또는 대문자 없음은 중요하지 않은 것입니다.
  3. 내 주요 프로젝트에서 xml에서 MTV보기를 확장했습니다. MagicTextView가 올바른 라이브러리 경로를 확인하십시오. 예를 들어, MTV 클래스 라이브러리는 com.library.library_magictextview.MagicTextView 기본보기의 xml을 읽어야합니다.

        <com.library.library_magictextview.MagicTextView
        android:textSize=           "50dp"
        android:textColor=          "#ffffffff"
        android:layout_width=       "fill_parent"
        android:layout_height=      "wrap_content"
    
        android:textStyle=          "bold"
        android:padding=            "20dp"
        android:gravity=            "center"
    
        r:strokeColor=          "#FFff0000"
        r:strokeJoinStyle=      "miter"
        r:strokeWidth=          "5"
        r:typeface=         "ReservoirGrunge"
        android:text=               "BobDillon" />
    

우리 상황에서는 캐시와 함께 Hit의 솔루션을 사용했습니다. 우리가 소개 한 문제는 동일한 블록 내에서 OTF 파일과 TTF 파일을 테스트하고 있었다는 것입니다. 똑같은 시도를 시도하는 동안

protected static Typeface getTypeface(Context p_context, String p_fontName){
    Typeface tf = null;
    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".otf");
    }catch(Exception e) {}

    if( tf != null ) return tf;

    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".ttf");
    }catch(Exception e) {}

    return tf;
}

제 경우에는 수동으로 만든 자산 폴더를 삭제하고 마법사를 사용하여 새 폴더를 만들었습니다. 분명히 자산 폴더로 읽지 않았지만 일반 폴더로 읽었으므로 getAssets ()가 작동하지 않고 오류가 발생했습니다.


안드로이드 스튜디오에서 : 나를 위해 일한 것은 ttf 파일을 fonts 하위 폴더없이 assets 폴더에 직접 넣는 것입니다. 하위 폴더 ((getAssets (), "fonts / oldengl.ttf")에서 작동하지 않았을 때 작동하지 않았습니다. src / main / assets / fonts에 ttf가 있습니다). 이것은 작동합니다 : src / main / assets / oldengl.ttf Typeface customfont = Typeface.createFromAsset (getAssets (), "oldengl.ttf");


이클립스 스타일 프로젝트와 안드로이드 스튜디오 스타일 프로젝트를 모두 지원하는 모듈을 가져올 때이 문제가 발생했습니다.

소스 세트에서 자산을 제거하여 문제를 해결했습니다.

defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName '1.0'

        sourceSets {
            main {
                java.srcDirs = ['src']
                res.srcDirs = ['res']
                //assets.srcDirs = ['assets']//commented this out because modlue was not having this directory
                manifest.srcFile 'AndroidManifest.xml'
            }
        }
    }

또는 프로젝트를 Android 스튜디오 스타일로 변환하면 내가 생각하는 문제를 해결할 수도 있습니다.


나의 경우에는,

그냥 이전 코드를 사용합니다. 그래서 assets 폴더에있는 글꼴 파일을 잊어 버렸습니다 ..

근데 2 시간 동안은 모르겠어요 ..

이 오류의 가능한 경우,

  1. 글꼴 파일이 없습니다.
  2. 잘못된 글꼴 이름 또는 잘못된 글꼴 확장

예 : fonts / roboto.otf 대신 fonts / roboto.ttf

참고 URL : https://stackoverflow.com/questions/12766930/native-typeface-cannot-be-made-only-for-some-people

반응형