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

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

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

android:fontFamily="sans-serif-light"

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

5 ответов

Решение

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

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

Смотрите Документы:

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

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

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

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

  val typeface = ResourcesCompat.getFont(Context, R.font.YOUR_FONT)
  TextView.setTypeface(typeface)

Динамически вы можете установить 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, вы можете больше узнать о шрифте по умолчанию в этом семействе шрифтов по умолчанию

На мой взгляд, все еще есть способ применять системные шрифты программно на 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);
}

Вариант 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.

Это было бы возможно с помощью

setTypeface(Typeface tf, int style) метод TextView учебный класс.

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

Другие вопросы по тегам