Как изменить шрифт в TextView? - PullRequest
278 голосов
/ 22 мая 2010

Как изменить шрифт в TextView, по умолчанию он отображается как Arial? Как изменить его на Helvetica?

Ответы [ 16 ]

337 голосов
/ 22 мая 2010

Во-первых, по умолчанию это не Arial. По умолчанию используется Droid Sans.

Во-вторых, чтобы перейти на другой встроенный шрифт, используйте android:typeface в XML макета или setTypeface() в Java.

В-третьих, в Android нет шрифта Helvetica. Встроенный выбор: Droid Sans (sans), Droid Sans Mono (monospace) и Droid Serif (serif). Хотя вы можете связывать свои собственные шрифты с вашим приложением и использовать их через setTypeface(), имейте в виду, что файлы шрифтов большие и в некоторых случаях требуют лицензионных соглашений (например, Helvetica, шрифт Linotype ) .

EDIT

Язык дизайна Android опирается на традиционные типографские инструменты такие как масштаб, пространство, ритм и выравнивание с базовой сеткой. Успешное развертывание этих инструментов важно, чтобы помочь пользователям быстро понять экран информации. Чтобы поддержать такое использование Типография, Ice Cream Sandwich представила новую семью типов под названием Roboto, созданный специально для требований UI и экраны высокого разрешения.

Текущая платформа TextView предлагает Roboto в тонком, легком, обычном и жирный шрифт, а также курсив для каждого веса. framework также предлагает Roboto Condensed вариант в обычном и жирном шрифте веса вместе с курсивом для каждого веса.

После ICS Android включает стиль шрифтов Roboto, Читать дальше Робото

РЕДАКТИРОВАТЬ 2

С появлением библиотеки поддержки 26 Android теперь поддерживает пользовательские шрифты: дефолт. Вы можете вставить новые шрифты в res / fonts , которые могут быть установлены для TextViews индивидуально либо в XML, либо программно. Шрифт по умолчанию для всего приложения также можно изменить, определив его styles.xml В документации разработчика Android есть четкое руководство по этому вопросу здесь

252 голосов
/ 22 марта 2012

Сначала скачайте .ttf файл нужного вам шрифта (arial.ttf).Поместите его в папку assets.(Внутри папки активов создайте новую папку с именем шрифты и поместите ее в нее.) Используйте следующий код для применения шрифта к вашему TextView:

Typeface type = Typeface.createFromAsset(getAssets(),"fonts/arial.ttf"); 
textView.setTypeface(type);
50 голосов
/ 06 мая 2012
Typeface tf = Typeface.createFromAsset(getAssets(),
        "fonts/DroidSansFallback.ttf");
TextView tv = (TextView) findViewById(R.id.CustomFontText);
tv.setTypeface(tf);
32 голосов
/ 27 января 2013

Возможно, вы захотите создать статический класс , который будет содержать все шрифты. Таким образом, вы не сможете создавать шрифт несколько раз, что может негативно сказаться на производительности . Просто убедитесь, что вы создали подпапку с именем " шрифты " в папке " assets ".

Сделайте что-то вроде:

public class CustomFontsLoader {

public static final int FONT_NAME_1 =   0;
public static final int FONT_NAME_2 =   1;
public static final int FONT_NAME_3 =   2;

private static final int NUM_OF_CUSTOM_FONTS = 3;

private static boolean fontsLoaded = false;

private static Typeface[] fonts = new Typeface[3];

private static String[] fontPath = {
    "fonts/FONT_NAME_1.ttf",
    "fonts/FONT_NAME_2.ttf",
    "fonts/FONT_NAME_3.ttf"
};


/**
 * Returns a loaded custom font based on it's identifier. 
 * 
 * @param context - the current context
 * @param fontIdentifier = the identifier of the requested font
 * 
 * @return Typeface object of the requested font.
 */
public static Typeface getTypeface(Context context, int fontIdentifier) {
    if (!fontsLoaded) {
        loadFonts(context);
    }
    return fonts[fontIdentifier];
}


private static void loadFonts(Context context) {
    for (int i = 0; i < NUM_OF_CUSTOM_FONTS; i++) {
        fonts[i] = Typeface.createFromAsset(context.getAssets(), fontPath[i]);
    }
    fontsLoaded = true;

}
}

Таким образом, вы можете получить шрифт из любого места в вашем приложении.

19 голосов
/ 23 апреля 2013

Лучшая практика

TextViewPlus.java:

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

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

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

    public TextViewPlus(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.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface typeface = null;
        try {
            typeface = Typeface.createFromAsset(ctx.getAssets(), asset);
        } catch (Exception e) {
            Log.e(TAG, "Unable to load typeface: "+e.getMessage());
            return false;
        }

        setTypeface(typeface);
        return true;
    }
}

attrs.xml: (где разместить res / values ​​)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TextViewPlus">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

Как использовать:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.mypackage.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="my_font_name_regular.otf">
    </com.mypackage.TextViewPlus>
</LinearLayout>

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

17 голосов
/ 14 октября 2012

Ответы выше верны. Просто убедитесь, что вы создаете подпапку с именем «шрифты» в папке «активы», если вы используете этот кусок кода.

14 голосов
/ 07 октября 2014

Еще один способ консолидации создания шрифтов ...

public class Font {
  public static final Font  PROXIMA_NOVA    = new Font("ProximaNovaRegular.otf");
  public static final Font  FRANKLIN_GOTHIC = new Font("FranklinGothicURWBoo.ttf");
  private final String      assetName;
  private volatile Typeface typeface;

  private Font(String assetName) {
    this.assetName = assetName;
  }

  public void apply(Context context, TextView textView) {
    if (typeface == null) {
      synchronized (this) {
        if (typeface == null) {
          typeface = Typeface.createFromAsset(context.getAssets(), assetName);
        }
      }
    }
    textView.setTypeface(typeface);
  }
}

А потом использовать в своей деятельности ...

myTextView = (TextView) findViewById(R.id.myTextView);
Font.PROXIMA_NOVA.apply(this, myTextView);

Имейте в виду, эта дважды проверенная идиома блокировки с изменяемым полем корректно работает только с моделью памяти, используемой в Java 1.5+.

12 голосов
/ 23 мая 2017

Рекомендуется использовать библиотеку поддержки Android версии 26.0.0 или выше.

ШАГ 1: добавить файл шрифта

  1. В папке res создать новый шрифт словарь ресурсов
  2. Добавить файл шрифта ( .ttf , .orf )

Например, когда файл шрифта будет helvetica_neue.ttf, который будет генерировать R.font.helvetica_neue

ШАГ 2: создать семейство шрифтов

  1. В папке font добавить новый файл ресурсов
  2. Включите в файл каждый атрибут шрифта, стиля и веса.

Например:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/helvetica_neue" />
</font-family>

ШАГ 3: используйте его

В макетах XML:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/my_font"/>

Или добавить шрифты к стилю:

<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
    <item name="android:fontFamily">@font/lobster</item>
</style>

Дополнительные примеры вы можете найти в документации:

Работа со шрифтами

7 голосов
/ 26 ноября 2013

Он немного староват, но я немного улучшил класс CustomFontLoader и хотел поделиться им, чтобы он был полезным. Просто создайте новый класс с этим кодом.

 import android.content.Context;
 import android.graphics.Typeface;

public enum FontLoader {

ARIAL("arial"),
TIMES("times"),
VERDANA("verdana"),
TREBUCHET("trbuchet"),
GEORGIA("georgia"),
GENEVA("geneva"),
SANS("sans"),
COURIER("courier"),
TAHOMA("tahoma"),
LUCIDA("lucida");   


private final String name;
private Typeface typeFace;


private FontLoader(final String name) {
    this.name = name;

    typeFace=null;  
}

public static Typeface getTypeFace(Context context,String name){
    try {
        FontLoader item=FontLoader.valueOf(name.toUpperCase(Locale.getDefault()));
        if(item.typeFace==null){                
            item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");                 
        }           
        return item.typeFace;
    } catch (Exception e) {         
        return null;
    }                   
}
public static Typeface getTypeFace(Context context,int id){
    FontLoader myArray[]= FontLoader.values();
    if(!(id<myArray.length)){           
        return null;
    } 
    try {
        if(myArray[id].typeFace==null){     
            myArray[id].typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+myArray[id].name+".ttf");                       
        }       
        return myArray[id].typeFace;    
    }catch (Exception e) {          
        return null;
    }   

}

public static Typeface getTypeFaceByName(Context context,String name){      
    for(FontLoader item: FontLoader.values()){              
        if(name.equalsIgnoreCase(item.name)){
            if(item.typeFace==null){
                try{
                    item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");     
                }catch (Exception e) {          
                    return null;
                }   
            }
            return item.typeFace;
        }               
    }
    return null;
}   

public static void loadAllFonts(Context context){       
    for(FontLoader item: FontLoader.values()){              
        if(item.typeFace==null){
            try{
                item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");     
            }catch (Exception e) {
                item.typeFace=null;
            }   
        }                
    }       
}   
}

Тогда просто используйте этот код при просмотре текста:

 Typeface typeFace=FontLoader.getTypeFace(context,"arial");  
 if(typeFace!=null) myTextView.setTypeface(typeFace);
5 голосов
/ 18 февраля 2018

Я наконец-то получил очень простое решение.

  1. использовать эти библиотеки поддержки в gradle уровня приложения ,

    compile 'com.android.support:appcompat-v7:26.0.2'
    compile 'com.android.support:support-v4:26.0.2'
    
  2. затем создайте каталог с именем "шрифт" внутри папки res

  3. поместите файлы шрифтов (ttf) в этот каталог шрифтов, помните о соглашениях по именованию [например, имя не должно содержать никаких специальных символов, символов верхнего регистра и пробела или табуляции]
  4. После этого ссылаться на этот шрифт из xml вот так

            <Button
            android:id="@+id/btn_choose_employee"
            android:layout_width="140dp"
            android:layout_height="40dp"
            android:layout_centerInParent="true"
            android:background="@drawable/rounded_red_btn"
            android:onClick="btnEmployeeClickedAction"
            android:text="@string/searching_jobs"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:fontFamily="@font/times_new_roman_test"
            />
    

В этом примере times_new_roman_test является файлом ttf шрифта из этого каталога шрифтов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...