Доступ к шрифту в папке активов из файла XML в Android - PullRequest
30 голосов
/ 19 июля 2011

Я пытаюсь выполнить изменение шрифта в приложении и создаю для этого файл стиля. В этом файле (ниже) я просто хочу изменить значение гарнитуры стиля 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 /". Как я могу получить доступ к этому шрифту, чтобы я мог использовать этот стиль в качестве темы, чтобы избавиться от изменения всех TextView вручную программно.

Как резюме: как получить доступ к «файлу из папки ресурсов» в XML?

Ответы [ 13 ]

73 голосов
/ 19 июля 2011

В моем исследовании нет способа добавить внешний шрифт в файл XML. В xml

доступен только шрифт по умолчанию 3

Но вы можете использовать в Java, используя этот код.

Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/verdana.ttf");  
textfield.setTypeface(tf,Typeface.BOLD);

Обновление:

Теперь я нахожу способ сделать это, создав собственный класс, расширяющий 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>

Обновление:

Обнаружены некоторые проблемы с производительностью при использовании этого пользовательского представления в 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;
    }
}
7 голосов
/ 30 октября 2013

Редактировать 2:

Наконец, шрифты поддерживаются XML (также обратно совместимы через библиотеку поддержки): https://developer.android.com/preview/features/fonts-in-xml.html


Edit:

Теперь я использую библиотеку Каллиграфия . Это самый простой способ для пользовательских шрифтов.

Что вы можете сделать:

  • Пользовательский шрифт в TextView
  • Пользовательский шрифт в TextAppearance
  • Пользовательский шрифт в стилях
  • Пользовательский шрифт в темах
  • FontSpannable, чтобы применить шрифт только к части текста

Я нашел другой способ сделать это.

Вы должны сделать свой собственный TextView, используя этот учебник

Это не так сложно, и после этого вы можете просто использовать это TextView со своим собственным шрифтом.

Не знаю, наблюдает ли кто-нибудь за этим, но я подумал, что это может помочь.

5 голосов
/ 16 января 2014

Использует эту функцию, если вы используете один шрифт.

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();
        }
    }
2 голосов
/ 21 июля 2011

Soorya прав, но если вам нужно поместить один и тот же шрифт во многие textViews, я рекомендую вам поместить этот код в статический метод, который возвращает требуемый Typeface. Это уменьшит количество строк в вашем коде. Или даже лучше создать класс, расширяющий Application, и создать метод GET, который возвращает Typeface. Этот метод будет доступен из любой Activity внутри вашего приложения (без необходимости использования статических переменных или статических методов).

1 голос
/ 21 сентября 2016

Я взял ответ дроида и заставил его работать с ЛЮБОМ шрифтом, просто введя имя файла шрифта прямо в 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);
        }
    }
}
1 голос
/ 01 сентября 2016

Вы только что сделали публичные вызовы и прикрепили метод, подобный этому

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 после того, как выпросто вызовите методы в любом месте с передачей двух параметров.

1 голос
/ 17 февраля 2016

fount change - это базовая функциональность в Android, которая в основном нужна каждому приложению. Поэтому каждый хочет изменить только один раз в приложении, что сокращает время разработки, поэтому я бы предложил вам увидеть эту ссылку FountChangerкласс .

0 голосов
/ 17 декабря 2018

// доступ к файлу шрифта в коде,

Typeface type = Typeface.createFromAsset(getResources().getAssets(),"fonts/arial.ttf");
textView.setTypeface(type);//assign typeface to textview

// в папке активов-> шрифты (имя_фоли) -> arial.ttf (имя файла шрифта)

0 голосов
/ 14 августа 2018

Вместо папки активов вы можете поместить файл .ttf в папку шрифтов.Чтобы использовать поддержку шрифтов в функции XML на устройствах под управлением Android 4.1 (уровень API 16) и выше, используйте библиотеку поддержки 26+.Щелкните правой кнопкой мыши по папке res, выберите новый -> каталог ресурсов Android -> выберите шрифт -> 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

0 голосов
/ 05 ноября 2016

1.Потому что мы можем добавить папку активов>, если ваш шрифт styles.ttfs в вашем приложении, то
2. напишите код доступа для шрифтов в таких строках, как:

<string name="fontregular">OpenSans-Light.ttf</string>
<string name="fontmedium">OpenSans-Regular.ttf</string>

3. Доступ к некоторыммакет XML-файла textview код, подобный приведенному ниже:

<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.При внесении изменений легко изменить приложение для лунки.Приятного кодирования продолжай улыбаться ..

...