Что эквивалентно «android: fontFamily =» sans-serif-light »в коде Java?

106

Мой вопрос довольно простой:

В каждом текстовом представлении я использую атрибут

android:fontFamily="sans-serif-light"

чтобы обеспечить великолепный вид на устройствах post HC.

К сожалению, это работает не со всеми виджетами, и для моих спиннеров мне нужно перезаписать адаптер.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //You can use the new tf here.

    if(convertView == null || convertView.getTag() == null) {
        // new view - populate 
        convertView = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
        convertView.setTag(new Object());
    }

    CheckedTextView spinner_text=(CheckedTextView) convertView.findViewById(android.R.id.text1);
    //Typeface should be set here...
    return spinner_text;
    }
}

Итак, есть ли способ получить точно такой же результат с помощью кода?

PS: Нет, я не хочу помещать шрифт в папку с ресурсами, я просто хочу использовать системный.

Waza_Be
источник

Ответы:

169

Это должно быть возможно с setTypeface()и Typeface.create():

convertView.setTypeface(Typeface.create("sans-serif-light", Typeface.NORMAL));

См. Документы :

Создайте объект гарнитуры с учетом имени семейства и информации о стиле параметров. Если в качестве имени передано значение null, то будет выбран шрифт «по умолчанию». Полученный объект гарнитуры можно запросить ( getStyle()), чтобы узнать, каковы его «настоящие» стилевые характеристики.

Обратите внимание, что чрезмерное использование Typeface.create()вредно для вашей памяти, как указано в этом комментарии . Предложил Hashtable является хорошим решением, но вы должны изменить его немного , так как вы не создать свой шрифт от актива.

сашхор
источник
2
Пожалуйста, остерегайтесь проблем с памятью, если у вас много спиннеров - я немного обновил свой ответ.
saschoar
44

Android 4.1 (уровень API 16) и библиотека поддержки 26 и выше

Если вы используете папку res -> font, вы можете использовать это так

  val typeface = ResourcesCompat.getFont(Context, R.font.YOUR_FONT)
  TextView.setTypeface(typeface)
Мургуплуоглу
источник
20

На мой взгляд, все еще есть способ программно применять системные шрифты в TextView без каких-либо проблем с памятью, и это использует textview.setTextAppearanceметод:

<style name="styleA">
    <item name="android:fontFamily">sans-serif</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
<style name="styleB">
    <item name="android:fontFamily">sans-serif-light</item>
    <item name="android:textStyle">normal</item>
    <item name="android:textColor">?android:attr/textColorTertiary</item>
</style>


if(condition){
    textView.setTextAppearance(context,R.style.styleA);
}else{
    textView.setTextAppearance(context,R.style.styleB);
}
Рахул Верма
источник
2
android:fontFamilyтребуется API 16.
CoolMind 03
2
Используйте TextViewCompat.setTextAppearance(textView, R.style.styleA).
CoolMind
19

Динамически вы можете установить fontfamily, подобное android: fontFamily в xml, используя это,

For Custom font:

 TextView tv = ((TextView) v.findViewById(R.id.select_item_title));
 Typeface face=Typeface.createFromAsset(getAssets(),"fonts/mycustomfont.ttf"); 
 tv.setTypeface(face);

For Default font:

 tv.setTypeface(Typeface.create("sans-serif-medium",Typeface.NORMAL));

Это список используемых по умолчанию семейств шрифтов , используйте любой из них, заменив строку в двойных кавычках "sans-serif-medium"

FONT FAMILY                    TTF FILE                    

1  casual                      ComingSoon.ttf              
2  cursive                     DancingScript-Regular.ttf   
3  monospace                   DroidSansMono.ttf           
4  sans-serif                  Roboto-Regular.ttf          
5  sans-serif-black            Roboto-Black.ttf            
6  sans-serif-condensed        RobotoCondensed-Regular.ttf 
7  sans-serif-condensed-light  RobotoCondensed-Light.ttf   
8  sans-serif-light            Roboto-Light.ttf            
9  sans-serif-medium           Roboto-Medium.ttf           
10  sans-serif-smallcaps       CarroisGothicSC-Regular.ttf 
11  sans-serif-thin            Roboto-Thin.ttf             
12  serif                      NotoSerif-Regular.ttf       
13  serif-monospace            CutiveMono.ttf              

"mycustomfont.ttf" - это файл ttf. Путь будет в src / assets / fonts / mycustomfont.ttf , вы можете узнать больше о шрифте по умолчанию в этом семействе шрифтов по умолчанию

Ананд Криш
источник
13

Вариант 1 - API 26 и выше

// Jave
Typeface typeface = getResources().getFont(R.font.myfont);
textView.setTypeface(typeface);

// Kotlin
val typeface = resources.getFont(R.font.myfont)
textView.typeface = typeface

Вариант 2 - API 16 и выше

// Java
Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);

// Kotlin
val typeface = ResourcesCompat.getFont(context, R.font.myfont)

Ознакомьтесь с полным сроком действия в Руководстве для разработчиков Android .

Скоро Сантос
источник
6

Можно было бы использовать

setTypeface(Typeface tf, int style)метод TextViewкласса.

spinner_text.setTypeface(Typeface.SANS_SERIF,Typeface.NORMAL);

Викас Гаурав
источник