#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 {
/** An LruCache for previously loaded typefaces. */
private LruCache sTypefaceCache = 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)
Комментариев нет:
Отправить комментарий