Я не могу сделать это из XML, используя android:typeface="/fonts/Molot.otf" атрибут?
Переведено автоматически
Ответ 1
Краткий ответ: Нет. Android не имеет встроенной поддержки применения пользовательских шрифтов к текстовым виджетам с помощью XML.
Однако есть обходной путь, который не так уж сложно реализовать.
Первый
Вам нужно будет определить свой собственный стиль. В папке / res / values откройте / создайте файл attrs.xml и добавьте объект с объявленным стилем, например:
Предполагая, что вы хотите часто использовать этот виджет, вам следует настроить простой кэш для загружаемых Typeface объектов, поскольку загрузка их из памяти "на лету" может занять некоторое время. Что-то вроде:
publicstatic FontManager getInstance() { if (instance == null) { // App.getContext() is just one way to get a Context here // getContext() is just a method in an Application subclass // that returns the application context AssetManagerassetManager= App.getContext().getAssets(); init(assetManager); } return instance; }
public Typeface getFont(String asset) { if (fonts.containsKey(asset)) return fonts.get(asset);
private String fixAssetFilename(String asset) { // Empty font filename? // Just return it. We can't help. if (TextUtils.isEmpty(asset)) return asset;
// Make sure that the font ends in '.ttf' or '.ttc' if ((!asset.endsWith(".ttf")) && (!asset.endsWith(".ttc"))) asset = String.format("%s.ttf", asset);
return asset; } }
Этот вариант позволит вам использовать расширения файлов .ttc, но он не тестировался.
Третье
Создайте новый класс, который подразделяет на подклассы TextView. В этом конкретном примере учитывается определенный шрифт XML (bold, italic и т.д.) и применяется он к шрифту (при условии, что вы используете файл .ttc).
/** * TextView subclass which allows the user to define a truetype font file to use as the view's typeface. */ publicclassFontTextextendsTextView { publicFontText(Context context) { this(context, null); }
if (ta != null) { StringfontAsset= ta.getString(R.styleable.FontText_typefaceAsset);
if (!TextUtils.isEmpty(fontAsset)) { Typefacetf= FontManager.getInstance().getFont(fontAsset); intstyle= Typeface.NORMAL; floatsize= getTextSize();
if (getTypeface() != null) style = getTypeface().getStyle();
if (tf != null) setTypeface(tf, style); else Log.d("FontText", String.format("Could not create a font from asset: %s", fontAsset)); } } } }
Наконец
Замените экземпляры TextView в вашем XML полным именем класса. Объявите свое пользовательское пространство имен точно так же, как вы бы объявили пространство имен Android. Обратите внимание, что "typefaceAsset" должен указывать на файл .ttf или .ttc, содержащийся в вашем каталоге /assets.
<com.example.FontText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a custom font text" custom:typefaceAsset="fonts/AvenirNext-Regular.ttf"/> </RelativeLayout>
Ответ 2
Вот пример кода, который делает это. У меня есть шрифт, определенный в статической конечной переменной, а файл шрифта находится в каталоге assets.
public classTextViewWithFontextendsTextView{
public TextViewWithFont(Context context, AttributeSet attrs) { super(context, attrs); this.setTypeface(MainActivity.typeface); }
public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.setTypeface(MainActivity.typeface); }
public TextViewWithFont(Context context) { super(context); this.setTypeface(MainActivity.typeface); }
}
Ответ 3
Создайте свой пользовательский TextView, соответствующий шрифту, который вы хотите использовать. В этом классе я использую статическое поле mTypeface для кэширования шрифта (для повышения производительности).
public classHeliVnTextViewextendsTextView{
/* * Caches typefaces based on their file path and name, so that they don't have to be created every time when they are referenced. */ private static Typeface mTypeface;
public HeliVnTextView(finalContext context) { this(context, null); }
public HeliVnTextView(finalContext context, finalAttributeSet attrs) { this(context, attrs, 0); }
public HeliVnTextView(finalContext context, finalAttributeSet attrs, final int defStyle) { super(context, attrs, defStyle);
Activity реализует LayoutInflater.Factory2, который обеспечивает обратные вызовы для каждого созданного представления. Можно стилизовать TextView с помощью атрибута пользовательского семейства шрифтов, загружать шрифты по запросу и автоматически вызывать setTypeface для созданных текстовых представлений.
К сожалению, из-за архитектурной взаимосвязи экземпляров Inflater относительно Activities и Windows простейшим подходом к использованию пользовательских шрифтов в Android является кэширование загруженных шрифтов на уровне приложения.