Який еквівалент "android: fontFamily =" sans-serif-light "у коді Java?


106

Моє запитання досить просте:

У кожному моєму перегляді тексту я наразі використовую атрибут

android:fontFamily="sans-serif-light"

щоб забезпечити чудовий вигляд пристроїв пост HC.

На жаль, це працює не з кожним віджетом, і для моїх Spinners мені потрібно перезаписати адаптер.

@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: Ні, я не хочу вводити шрифт у папку активів, я просто хочу використовувати системний.

Відповіді:


168

Це повинно бути можливим з setTypeface()і Typeface.create():

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

Див. Документи :

Створіть об'єкт шрифту, задавши прізвище та інформацію про стиль опції. Якщо для імені передано null, вибереться шрифт "за замовчуванням". Отриманий об'єкт шрифту можна запитати ( getStyle()), щоб виявити, які його "справжні" характеристики стилю.

Зауважте, що надмірне використання Typeface.create()погано впливає на вашу пам'ять, як зазначено в цьому коментарі . Запропонував Hashtable є хорошим рішенням, але ви повинні змінити його трохи , так як ви не створити свій шрифт від активу.


2
Будьте обачні з питаннями пам’яті, якщо у вас багато предметів спінеру - я трохи оновив свою відповідь.
сашоар

44

Android 4.1 (рівень API 16) та бібліотека підтримки 26 і новіших версій

Якщо ви використовуєте папку шрифту res ->, ви можете використовувати так

  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

2
Використовуйте TextViewCompat.setTextAppearance(textView, R.style.styleA).
CoolMind

19

Динамічно ви можете встановити шрифт, схожий на 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 / tools / 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);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.