일부 사람들에게만 "네이티브 서체를 만들 수 없습니다"
일부 요소의 글꼴 서체를 변경하는 앱이 있습니다. 대부분의 사람들에게 잘 작동하지만 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 클래스를 라이브러리에 다수 메인 프로젝트에서 사용했습니다. 작동 방법은 다음과 가변합니다.
- 주 프로젝트 자산 폴더에서 fonts라는 하위 폴더를 만듭니다.
- ttf 파일을 자산 / 글꼴 폴더에 복사하십시오. 내 파일 이름은 camelcase (예 : ReservoirGrunge.ttf) 였지만 대문자 또는 대문자 없음은 중요하지 않은 것입니다.
내 주요 프로젝트에서 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 시간 동안은 모르겠어요 ..
이 오류의 가능한 경우,
- 글꼴 파일이 없습니다.
- 잘못된 글꼴 이름 또는 잘못된 글꼴 확장
예 : fonts / roboto.otf 대신 fonts / roboto.ttf
참고 URL : https://stackoverflow.com/questions/12766930/native-typeface-cannot-be-made-only-for-some-people
'ProgramingTip' 카테고리의 다른 글
SQL ORDER BY 여러 값을 특정 순서로? (0) | 2020.10.20 |
---|---|
getIntent () Extras 항상 NULL (0) | 2020.10.20 |
javadoc을 private 필드에 연결하는 방법은 무엇입니까? (0) | 2020.10.19 |
Java Future를 CompletableFuture로 전환 (0) | 2020.10.19 |
SignalR 2.0 .NET 클라이언트를 서버 허브에 다시 연결하는 모범 사례 (0) | 2020.10.19 |