Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Android ActionBar custom text font

#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)

Комментариев нет:

Отправить комментарий