2016-11-14 14 views
1

У меня есть пользовательский расширенный TextView Я использую для пользовательских шрифтов в своем приложении, но по какой-то причине я продолжаю получать исключение во время выполнения, Не находите этот шрифт.Runtime Exception: Шрифт не найден для каждого шрифта, который я пробовал - Android

Формат каталога Я использую это main > assets > fonts > Portrait-Light.ttf

screenshot of directory

Я искал везде для решения, но все они, кажется, округление до тех же ответов на SO.

CustomFontTextView.java:

public class CustomFontTextView extends TextView { 

    public CustomFontTextView(Context context) { 
     super(context); 
     applyCustomFont(context); 
    } 

    public CustomFontTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     applyCustomFont(context); 
    } 

    public CustomFontTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     applyCustomFont(context); 
    } 

    private void applyCustomFont(Context context) { 
     Log.e("it gets here", "custom font"); 
     Typeface customFont = FontCache.getTypeface("Roboto-Italic.ttf", context); 
     setTypeface(customFont); 
    } 
} 

FontCache.java

class FontCache { 

    private static HashMap<String, Typeface> fontCache = new HashMap<>(); 

    static Typeface getTypeface(String fontname, Context context) { 
     Typeface typeface = fontCache.get(fontname); 
     if (typeface == null) { 
      try { 
       typeface = Typeface.createFromAsset(context.getAssets(), "fonts/" + fontname); 
      } catch (Exception e) { 
       Log.e("failed", e.getMessage()); 
      } 
      fontCache.put(fontname, typeface); 
     } 
     return typeface; 
    } 
} 

XML:

<icn.premierandroid.misc.CustomFontTextView 
      android:id="@+id/switch_description" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:textSize="14sp" 
      android:textColor="@color/colorPrimary" 
      android:gravity="center_horizontal" 
      android:text="@string/are_you_over_18_years_old"/> 

Я ВГА e пробовал это в разных форматах, таких как .otf и с разными шрифтами, такими как Roboto-Italic.ttf и еще один случайный из dafont.com под названием Sunset-Clouds.ttf, но все же я получаю сообщение об ошибке, что происходит? это должно работать. На всякий случай я даже обновил все плагины, такие как Gradle, Grade-Wrapper и Android.

Я также попробовал единственный способ сделать это:

AssetManager am = context. getApplicationContext(). getAssets(); 
    Typeface font = Typeface.createFromAsset(
    am, String.format(Locale.US, "fonts/%s", "portrait-light.ttf")); 

я упускаю что-то?

Update:

Удаление улова показывает эту StackTrace.

процесса: icn.premierandroid, PID: 3829 java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {icn.premierandroid/icn.premierandroid.RegisterActivity}: android.view.InflateException: Binary линия XML-файл # 100: Ошибка накачивания класс icn.premierandroid.misc.CustomFontTextView на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2702) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2767) ... ..

Причина: android.view.InflateException: B Инары XML файл строка # 100: Ошибка при наполнении класса icn.premierandroid.misc.CustomFontTextView в android.view.LayoutInflater.createView (LayoutInflater.java:640) в android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:750) в android.view.LayoutInflater.rInflate (LayoutInflater.java:813)

.....

Вызванный: java.lang.reflect.InvocationTargetException в java.lang.reflect.Constructor.newInstance (Нативный метод) at java.lang.reflect.Constructor.newInstance (Конструктор.Java: 288) в android.view.LayoutInflater.createView (LayoutInflater.java:614)

....

Вызванный: java.lang.RuntimeException: Шрифт активов не найден шрифтов/GleegooRegular. TTF в android.graphics.Typeface.createFromAsset (Typeface.java:272) на icn.premierandroid.misc.FontCache.getTypeface (FontCache.java:21) в icn.premierandroid.misc.CustomFontTextView.applyCustomFont (CustomFontTextView.java : 28) at icn.premierandroid.misc.CustomFontTextView. (CustomFontTextView.java:18) at java.lang.reflect.Constructor .newInstance (Native Method)

.....

UPDATE 2:

Хорошо, так что это странно обходным для этого. Очевидно, андроид-студия не нравится, когда вы добавляете папку assets прямо в папку main внутри app/src/main. Сначала необходимо добавить его в папку app/src/main/res, а затем переместить в папку main. Не знаю, почему это так, но это решило мою проблему.

+0

пожалуйста, напишите об ошибке StackTrace –

+0

@maxost, добавил его для вас, бутон. – BIW

+0

«Font asset not found fonts/GleegooRegular.ttf», я не уверен, но я не вижу этот шрифт в вашем каталоге шрифтов. – harshitpthk

ответ

1

Я думаю, что настоящая проблема в том, что вы не настроили свои активы производная Если у вас, это будет выглядеть следующим образом в проектном:

Asset folder with pictogram

Или как это в Android зрения:

Asset folder with pictogram, Android view

Таким образом, вы должны просто добавить эту папку в папке активов в студии : Нажмите на окно структуры проекта (или нажмите Alt + 1), затем нажмите Alt + Insert и выберите Folder/Assets Folder. Тогда разместите свои шрифты.

Обновление от OP:

Хорошо, так что это странно обходным для этого. Очевидно, андроид-студия не нравится, когда вы добавляете папку с ресурсами прямо в основную папку внутри приложения/src/main. Сначала вам нужно добавить его в папку app/src/main/res, а затем переместить в основную папку. Не знаю, почему это так, но это решило мою проблему.

+0

Я добавил его таким образом, я попробую удалить его и добавить его снова. я дам вам знать результат. – BIW

1

Мы написали этот класс для наших нужд. Это позволяет установить наши собственные шрифты, используя атрибут, например:

app:customFont="Roboto-Medium.ttf" 

Надеется, вы найдете это полезное:

public class TextViewFonted extends TextView { 
    private static final String TAG = "TextViewFonted"; 

    public TextViewFonted(Context context) { 
     super(context); 
    } 

    public TextViewFonted(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setCustomFont(context, attrs); 
    } 

    public TextViewFonted(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setCustomFont(context, attrs); 
    } 

    private void setCustomFont(Context ctx, AttributeSet attrs) { 
     TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewFonted); 
     String customFont = a.getString(R.styleable.TextViewFonted_customFont); 
     if (customFont == null) customFont = "Roboto-Regular.ttf"; 
     setCustomFont(ctx, customFont); 
     a.recycle(); 
    } 

    public boolean setCustomFont(Context ctx, String asset) { 
     Typeface tf = null; 
     try { 
      tf = Typeface.createFromAsset(ctx.getAssets(), asset); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not get typeface", e); 
      return false; 
     } 

     setTypeface(tf); 
     setLineSpacing(getTextSize() * 0.3f, 0.75f); 
     return true; 
    } 
} 

И, чтобы иметь возможность использовать этот пользовательский атрибут, вы должны добавить к вашему ATTRS .xml следующий блок (так R.styleable.TextViewFonted_customFont будет работать):

<declare-styleable name="TextViewFonted"> 
     <attr name="customFont" format="string"/> 
</declare-styleable> 

В нашем случае, мы поместить шрифты в корне активов папок, но вы можете изменить это поведение в методе setCustomFont()

Update

Чтобы добавить этот шрифт, например, мы используем

Screenshot of fonts that are in assets folder

app:customFont="Comfortaa-Bold.ttf" 
+0

Я дам вам эту попытку и дам вам знать, спасибо за ответ. – BIW

+0

, к сожалению, он все еще дает мне «java.lang.RuntimeException: свойство шрифта не найден» внутри каталога шрифтов и внутри каталога активов. – BIW

+0

Посмотрите на обновленный ответ, я добавил скриншот с активами. Вы уверены, что не ошиблись в имени шрифта? – Gaket

0

Попробуйте это ....

put .ttf fonts in app > assets > fonts > Roboto-Italic.ttf 

А потом в OnCreate метод,

Typeface Roboto = Typeface.createFromAsset(getAssets(), 
      "fonts/Roboto-Italic.ttf"); 

и установить шрифт в TextView и т.д.

textview.setTypeface(Roboto); 
+0

плохо попробуйте и дайте знать. – BIW