Настройка шрифта Roboto в TextView - xml

Я нашел несколько сообщений по этой теме, но все эти темы либо задают шрифт с помощью метода setTypeFace() для объекта TextView, либо создают пользовательский класс, который устанавливает шрифт в Roboto и extends TextView. Насколько я знаю из API-уровня 11 (?) Или чего-то еще, мы можем установить TypeFace как атрибут xml, каким-то образом. Вот так:

   <TextView
      android:id="@+id/profileHeader"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:typeface="roboto"
      android:text="Hello, world">
   </TextView>

Каков правильный способ сделать это? Возможно ли иметь откат, если приложение работает на устройстве ниже уровня API 11 (?), Например:

 android:typeface="roboto|monospace|serif"

Ответ 1

Взгляните на проект RobotoTextView. Работает до Android 1.5, и вы можете установить шрифт с помощью атрибутов XML. Он также включает в себя другие виды, такие как RobotoButton, RobotoCheckbox и т.д.

Ответ 2

Я не вижу способа определить внешний шрифт как атрибут xml. Вы должны сохранить шрифт в активах и вызвать:

tv.setTypeface( Typeface.createFromAsset( context.getAssets(), roboto.ttf ) );

Ответ 3

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

TextView tvTextView = (TextView) findViewById(R.id.textView1);
Typeface typeface = Typeface.createFromAsset(getAssets(),"Roboto.ttf");
tvTextView.setTypeface(typeface);

Надеюсь, это поможет вам.: D

Ответ 4

Атрибут android:typeface содержит несколько допустимых параметров (в соответствии с документами Android)...

  • нормально
  • без
  • засечек
  • моноширинный

Если вам нужен шрифт Roboto в приложении для более старых устройств, вам нужно включить файлы Roboto TTF в свой проект.

Наиболее очевидным способом использования этих шрифтов является использование метода setTypeface() TextView, но если вы хотите указать его в XML вместо этого, вы должны создать собственный TextView и создать свой собственный атрибут стиля для своего пользовательского TextView.

Этот раздел по всему Интернету.

Ответ 5

Для JellyBean (4.1) далее вы можете использовать метод, представленный в fooobar.com/questions/14182/.... Он будет изящно отказываться от старых устройств. Если вы должны отступить в моноширину или засечку, объявите папку layout-v16, где вы используете шрифт, который вы выбрали, т.е. "Sans-serif-condensed", а в папке по умолчанию используется шрифт "monospace" или "serif". Если вы хотите вернуться к шрифту, отличному от стандартного, вы можете программно проверить версию Android и выбрать соответствующее действие, то есть:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
    TextView textView = (TextView) findViewById(R.id.textView_id);
    Typeface myFont = Typeface.createFromAsset(getAssets(),"RobotoCondensed.ttf");
    textView.setTypeface(myFont);
}

Ответ 6

Это для будущих людей, работающих в той же проблеме, что и я. Настройка шрифта имеет тенденцию занимать много памяти, когда дело доходит до загрузки нескольких строк. Используя два следующих кода, чтобы заставить его работать плавно. Я получил решение из stackoverflow, но ответы не были указаны вместе.

public class RobotoTextView extends TextView {

Context context;

public RobotoTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
}

public RobotoTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
}

public RobotoTextView(Context context) {
    super(context);
    this.context = context;
}

public void setTypeface(Typeface tf, int style) {
    if (!isInEditMode()) {
        if (style == Typeface.NORMAL) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Light.ttf"));
        } else if (style == Typeface.ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-LightItalic.ttf"));
        } else if (style == Typeface.BOLD) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Bold.ttf"));
        } else if (style == Typeface.BOLD_ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-BoldItalic.ttf"));
        }

    }
}



public class TypeFaceProvider {

private static Hashtable<String, Typeface> sTypeFaces = new Hashtable<String, Typeface>(
        4);

public static Typeface getTypeFace(Context context, String fileName) {
    Typeface tempTypeface = sTypeFaces.get(fileName);

    if (tempTypeface == null) {
        tempTypeface = Typeface.createFromAsset(context.getAssets(),
                fileName);
        sTypeFaces.put(fileName, tempTypeface);
    }

    return tempTypeface;
}
}