#java #android #шрифты #actionbar #span
Большинство людей в интернете советуют для этого следующую конструкцию: SpannableString s = new SpannableString("My Title"); s.setSpan(new TypefaceSpan(this, "My_Font.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); getSupportActionBar().setTitle(s); Но у меня горит красным (this, "My_Font.ttf"). Нашёл на англицком StackOverFlow брата по несчастью, ему посоветовали: please get the activity/application context and pass it to constructor rather than this as this will give currently running class while you need the current context. Я пытался. Сначала писал MyActivity.getApplicationContext(); вместо this. Он сказал non static method cannot be referenced from static context. Потом перед конструкцией писал Context context; context = getApplicationContext(); и в скобках Context context вместо this. В этом случае он подчёркивал уже пробел между Context и context. Я чувствую, что хожу вокруг да около, но всё никак не попадаю. Что делать? UPDATE#1 Нашёл полный код применения конструкции. Красным больше ничто не подчёркивается, но Activity вылетает. class TypefaceSpan extends MetricAffectingSpan { /** AnLruCache
for previously loaded typefaces. */ private LruCachesTypefaceCache = new LruCache (5); private Typeface mTypeface; /** * Load the {@link Typeface} and apply to a spannable. */ public TypefaceSpan(Context context, String typefaceName) { mTypeface = sTypefaceCache.get(typefaceName); if (mTypeface == null) { mTypeface = Typeface.createFromAsset(context.getApplicationContext() .getAssets(), String.format("fonts/%s", typefaceName)); // Cache the loaded Typeface sTypefaceCache.put(typefaceName, mTypeface); } } @Override public void updateMeasureState(TextPaint p) { p.setTypeface(mTypeface); } @Override public void updateDrawState(TextPaint tp) { tp.setTypeface(mTypeface); }} Context context; context = getApplicationContext(); SpannableString s = new SpannableString("My Title"); s.setSpan(new TypefaceSpan(context, "FDMedian.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); getSupportActionBar().setTitle(s); UPDATE#2 логи с ошибками: 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: FATAL EXCEPTION: main 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.morpheus.sketc_000.morpheuscompanygames/com.morpheus.sketc_000.morpheuscompanygames.Activity2}: java.lang.RuntimeException: native typeface cannot be made 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.access$600(ActivityThread.java:141) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5103) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:525) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: Caused by: java.lang.RuntimeException: native typeface cannot be made 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.graphics.Typeface. (Typeface.java:175) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.graphics.Typeface.createFromAsset(Typeface.java:149) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at com.morpheus.sketc_000.morpheuscompanygames.Activity2$1TypefaceSpan. (Activity2.java:35) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at com.morpheus.sketc_000.morpheuscompanygames.Activity2.onCreate(Activity2.java:54) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5133) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.access$600(ActivityThread.java:141) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5103) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:525) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 01-25 00:18:42.939 20035-20035/com.morpheus.sketc_000.morpheuscompanygames E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
Ответы
Ответ 1
Есть несколько причин, которые могут вызвать java.lang.RuntimeException: native typeface cannot be made: используете неправильное расширение разместили шрифты в папке с ресурсами (корень assets), а не внутри assets/fonts/ не добавили файл с шрифтами имя файла с шрифтом должен быть написан строчными буквами(например, надо переименовать MyFont.ttf в myfont.ttf)
Комментариев нет:
Отправить комментарий