Доступ к шрифту под папкой активов из файла XML в Android
Я пытаюсь выполнить изменение шрифта в приложении и создаю файл стиля для этого. В этом файле (ниже) я просто хочу изменить значение шрифта стиля TextAppearance для Android.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NightRiderFont" parent="@android:style/TextAppearance">
<item name="android:typeface"> /***help need here***/ </item>
</style>
</resources>
Однако шрифт находится в "assets/fonts/". Как я могу получить доступ к этому шрифту, поэтому я могу использовать этот стиль в качестве темы, чтобы избавиться от изменения всех текстовых элементов вручную.
Как резюме: Как я могу получить доступ к файлу из папки с данными в XML?
Ответы
Ответ 1
В моих исследованиях нет возможности добавить внешний шрифт в xml файл. Только шрифт 3 по умолчанию доступен в xml
Но вы можете использовать в java, используя этот код.
Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/verdana.ttf");
textfield.setTypeface(tf,Typeface.BOLD);
Update:
Теперь я нахожу способ сделать это, создав собственный класс, расширяющий TextView, и использую его в XML файле.
public class TextViewWithFont extends TextView {
private int defaultDimension = 0;
private int TYPE_BOLD = 1;
private int TYPE_ITALIC = 2;
private int FONT_ARIAL = 1;
private int FONT_OPEN_SANS = 2;
private int fontType;
private int fontName;
public TextViewWithFont(Context context) {
super(context);
init(null, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
// Load attributes
final TypedArray a = getContext().obtainStyledAttributes(
attrs, R.styleable.font, defStyle, 0);
fontName = a.getInt(R.styleable.font_name, defaultDimension);
fontType = a.getInt(R.styleable.font_type, defaultDimension);
a.recycle();
MyApplication application = (MyApplication ) getContext().getApplicationContext();
if (fontName == FONT_ARIAL) {
setFontType(application .getArialFont());
} else if (fontName == FONT_OPEN_SANS) {
setFontType(application .getOpenSans());
}
}
private void setFontType(Typeface font) {
if (fontType == TYPE_BOLD) {
setTypeface(font, Typeface.BOLD);
} else if (fontType == TYPE_ITALIC) {
setTypeface(font, Typeface.ITALIC);
} else {
setTypeface(font);
}
}
}
и в xml
<com.example.customwidgets.TextViewWithFont
font:name="Arial"
font:type="bold"
android:layout_width="wrap_content"
android:text="Hello world "
android:padding="5dp"
android:layout_height="wrap_content"/>
Не забудьте добавить схему в корень вашего xml
xmlns:font="http://schemas.android.com/apk/res-auto"
И создайте файл attrs.xml
внутри каталога values
, который содержит наши пользовательские атрибуты:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="font">
<attr name="type">
<enum name="bold" value="1"/>
<enum name="italic" value="2"/>
</attr>
<attr name="name">
<enum name="Arial" value="1"/>
<enum name="OpenSans" value="2"/>
</attr>
</declare-styleable>
</resources>
Update:
Обнаружена некоторая проблема с производительностью, когда это пользовательское представление используется в listview, потому что объект шрифта создается каждый раз, когда загружается вид. Решение, которое я нашел, это инициализировать шрифт в приложении Класс и ссылайтесь на этот объект шрифта на
MyApplication application = (MyApplication) getContext().getApplicationContext();
Класс приложения будет выглядеть следующим образом:
public class MyApplication extends Application {
private Typeface arialFont, openSans;
public void onCreate() {
super.onCreate();
arialFont = Typeface.createFromAsset(getAssets(), QRUtils.FONT_ARIAL);
openSans = Typeface.createFromAsset(getAssets(), QRUtils.FONT_OPEN_SANS);
}
public Typeface getArialFont() {
return arialFont;
}
public Typeface getOpenSans() {
return openSans;
}
}
Ответ 2
Изменить 2:
Наконец, шрифты поддерживаются xml (также обратно совместимыми через библиотеку поддержки): https://developer.android.com/preview/features/fonts-in-xml.html
Edit:
Теперь я использую библиотеку Calligraphy. Это самый простой способ для пользовательских шрифтов.
Что вы можете сделать:
- Пользовательский шрифт в
TextView
- Пользовательский шрифт в TextAppearance
- Пользовательский шрифт в стилях
- Пользовательский шрифт в Темы
- FontSpannable для применения шрифта только к части текста
Я нашел другой способ сделать это.
Вы должны сделать свой собственный TextView
, используя этот учебник
Это не так сложно, и после этого вы можете просто использовать этот TextView
со своим собственным шрифтом.
Я не знаю, смотрит ли кто-нибудь еще, но я подумал, что это может помочь.
Ответ 3
Использует эту функцию, если вы используете одиночный шрифт.
public static void applyFont(final Context context, final View root, final String fontName) {
try {
if (root instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) root;
for (int i = 0; i < viewGroup.getChildCount(); i++)
applyFont(context, viewGroup.getChildAt(i), fontName);
} else if (root instanceof TextView)
((TextView) root).setTypeface(Typeface.createFromAsset(context.getAssets(), fontName));
} catch (Exception e) {
Log.e("ProjectName", String.format("Error occured when trying to apply %s font for %s view", fontName, root));
e.printStackTrace();
}
}
Ответ 4
Сория прав, но если вы должны поместить тот же шрифт во многие текстовые элементы, я рекомендую вам поместить этот код внутри статического метода, который возвращает требуемый Typeface. Это уменьшит количество строк в вашем коде. Или даже лучше создать класс, расширяющий приложение и создающий метод GET, который возвращает Typeface. Этот метод будет доступен из любой активности внутри вашего приложения (без использования статических переменных или статических методов).
Ответ 5
fount change - очень базовая функциональность в android, которая в основном необходима для каждого приложения. Каждый, кто хочет изменить только один раз в приложении, что сокращает время разработки, поэтому я бы предложил вам увидеть эту ссылку
FountChanger.class.
Ответ 6
Вы только что сделали публичные звонки и ввели метод, подобный этому
public class TextViewFontType {
public Typeface typeface;
public void fontTextView(final TextView textView, final String fonttype) {
typeface = Typeface.createFromAsset(textView.getContext().getAssets(), fonttype);
textView.setTypeface(typeface);
}
используете ли вы какой-либо метод TextView set font-family.
public class FontList {
public static final String gothicbNormal="fonts/gothicb.ttf";
public static final String gothicbBold="fonts/gothicb.ttf";
}
сделал FontList calss после того, как вы только что вызвали методы где-либо с параметром pass two.
Ответ 7
Я принял ответ дроида-парня и заставил его работать с ANY-шрифтом, просто набрав имя файла шрифта непосредственно в XML:
layout.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto" >
<!-- where font file is at "assets/fonts/arial.ttf" -->
<com.odbol.widgets.TextViewWithFont
...
custom:fontFilePath="fonts/arial.ttf" />
</RelativeLayout>
Fonts.java
public class Fonts {
// use Weak so fonts are freed from memory when you stop using them
private final static Map<String, Typeface> fonts = new WeakHashMap<>(5);
/***
* Returns a font at the given path within the assets directory.
*
* Caches fonts to save resources.
*
* @param context
* @param fontPath Path to a font file relative to the assets directory, e.g. "fonts/Arial.ttf"
* @return
*/
public synchronized static Typeface getFont(Context context, String fontPath) {
Typeface font = fonts.get(fontPath);
if (font == null) {
font = Typeface.createFromAsset(context.getAssets(), fontPath);
fonts.put(fontPath, font);
}
return font;
}
}
<сильные > значения /attrs.xml
<resources>
<declare-styleable name="TextViewWithFont">
<!-- a path to a font, relative to the assets directory -->
<attr name="fontFilePath" format="string" />
<attr name="type">
<enum name="bold" value="1"/>
<enum name="italic" value="2"/>
</attr>
</declare-styleable>
</resources>
TextViewWithFont.java
public class TextViewWithFont extends TextView {
private int defaultDimension = 0;
private int TYPE_BOLD = 1;
private int TYPE_ITALIC = 2;
private int fontType;
private int fontName;
public TextViewWithFont(Context context) {
super(context);
init(null, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
// Load attributes
final TypedArray a = getContext().obtainStyledAttributes(
attrs, R.styleable.TextViewWithFont, defStyle, 0);
String fontPath = a.getString(R.styleable.TextViewWithFont_fontFilePath);
fontType = a.getInt(R.styleable.TextViewWithFont_type, defaultDimension);
a.recycle();
if (fontPath != null) {
setFontType(Fonts.getFont(getContext(), fontPath));
}
}
private void setFontType(Typeface font) {
if (fontType == TYPE_BOLD) {
setTypeface(font, Typeface.BOLD);
} else if (fontType == TYPE_ITALIC) {
setTypeface(font, Typeface.ITALIC);
} else {
setTypeface(font);
}
}
}
Ответ 8
Надеюсь, вам будет полезно: -
TextView text = (TextView) findViewById(R.id.custom_font);
Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf");
text.setTypeface(font);
Ответ 9
Вы можете использовать эту библиотеку: https://github.com/chrisjenx/Calligraphy
Вам нужно только добавить шрифт, который вы хотите использовать в своем макете.
Вот так:
<TextView
fontPath="fonts/verdana.ttf"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Ответ 10
1.Fisrt мы можем добавить папку активов> в том, что ваш шрифт styles.ttfs в вашем приложении, то
2. напишите код доступа для шрифтов в строках, таких как:
<string name="fontregular">OpenSans-Light.ttf</string>
<string name="fontmedium">OpenSans-Regular.ttf</string>
3. Доступ к тексту кода XML файла макета, подобному приведенному ниже:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@string/fontregular"
android:textColor="@color/normalfont"
android:textSize="@dimen/textregular"/>
4. добавить размеры для размера шрифта:
<dimen name="textregular">14sp</dimen>
<dimen name="textheader">16sp</dimen>
<dimen name="smalltext">12sp</dimen>
<dimen name="littletext">10sp</dimen>
<dimen name="hightfont">18sp</dimen>
5. добавить цвет шрифта в цветах:
<color name="normalfont">#666</color>
<color name="headerfont">#333</color>
<color name="aquablue">#4da8e3</color>
<color name="orange">#e96125</color>
6.При внесении изменений это простой процесс, чтобы изменить отверстие приложения. Удачного кодирования продолжай улыбаться..
Ответ 11
Вместо папки assets вы можете поместить файл.ttf в папку fonts. Чтобы использовать поддержку шрифтов в функции XML на устройствах под управлением Android 4.1 (уровень API 16) и выше, используйте библиотеку поддержки 26+. Щелкните правой кнопкой мыши папку Res, новая → ресурс Android directory-> выберите шрифт → Ok. поместите ваш файл "myfont.ttf" во вновь созданную папку шрифтов.
На res/values /styles.xml добавить,
<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
<item name="android:fontFamily">@font/myfont</item>
</style>
В файле макета добавьте android: textAppearance = "@style/customfontstyle",
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/customfontstyle"/>
См. Https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.
Ответ 12
//доступ к файлу шрифта в коде, Typeface type = Typeface.createFromAsset(getResources(). getAssets(), "fonts/arial.ttf"); textView.setTypeface(type);//назначаем шрифт для textview
//в активах folder-> шрифты (имя_фолдера) → arial.ttf (имя файла шрифта)
Ответ 13
Вы можете получить доступ к своему файлу шрифтов из папки с данными в файл xml.
Android: FontFamily = "Шрифты/roboto_regular.ttf"
fonts - это подпапка в папке с ресурсами.