Valores válidos para android: fontFamily e para o que eles mapeiam?

266

Na resposta a esta pergunta, o usuário lista valores para android:fontFamilye 12 variantes (veja abaixo). De onde vêm esses valores? A documentação para android:fontFamilynão lista essas informações em nenhum lugar (verifiquei aqui e aqui ). As strings estão listadas no arquivo styles.xml do Android em vários lugares, mas como elas são mapeadas de volta para a fonte Roboto?

No Android 4.1 / 4.2, as seguintes famílias de fontes Roboto estão disponíveis:

android:fontFamily="sans-serif"           // roboto regular  
android:fontFamily="sans-serif-light"     // roboto light  
android:fontFamily="sans-serif-condensed" // roboto condensed  
android:fontFamily="sans-serif-thin"      // roboto thin (android 4.2)  
android:fontFamily="sans-serif-medium"    // roboto medium (android 5.0)

em combinação com isso

android:textStyle="normal|bold|italic" 

São possíveis 12 variantes:

  • Regular
  • itálico
  • Negrito
  • Negrito itálico
  • Luz
  • Itálico claro
  • Fino
  • Itálico fino
  • Condensado regular
  • Itálico condensado
  • Condensado em negrito
  • Condensado em negrito-itálico

No styles.xmlarquivo do aplicativo, estou trabalhando em alguém listado como família de fontes e tenho certeza de que está errado:

<item name="android:fontFamily">Roboto-Regular.ttf</item>

Gostaria de configurar o tema para o nosso aplicativo corretamente (que inclui o uso correto do fontFamily) e remover toda a redundância existente em alguns dos estilos criados antes de eu dar uma olhada no arquivo.

Christopher Perry
fonte

Respostas:

346

De onde vêm esses valores? A documentação para android: fontFamily não lista essas informações em nenhum lugar

De fato, eles não estão listados na documentação. Mas eles são mencionados aqui na seção 'Famílias de fontes'. O documento lista todas as novas API públicas do Android Jelly Bean 4.1.

No arquivo styles.xml do aplicativo, estou trabalhando em alguém listado como a família de fontes e tenho certeza de que está errado:

Sim, está errado. Você não faz referência ao arquivo da fonte, precisa usar o nome da fonte mencionado no documento vinculado acima. Nesse caso, deveria ter sido o seguinte:

<item name="android:fontFamily">sans-serif</item>

Como a resposta vinculada já mencionada, são possíveis 12 variantes:

Adicionado no Android Jelly Bean (4.1) - API 16:

Regular (padrão):

<item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">normal</item> 

Itálico :

<item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">italic</item>

Negrito :

<item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">bold</item>

Negrito e itálico :

<item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">bold|italic</item>

Luz :

<item name="android:fontFamily">sans-serif-light</item>
<item name="android:textStyle">normal</item>

Itálico claro :

<item name="android:fontFamily">sans-serif-light</item>
<item name="android:textStyle">italic</item>

Fino :

<item name="android:fontFamily">sans-serif-thin</item>
<item name="android:textStyle">normal</item>

Itálico fino :

<item name="android:fontFamily">sans-serif-thin</item>
<item name="android:textStyle">italic</item>

Condensado regular :

<item name="android:fontFamily">sans-serif-condensed</item>
<item name="android:textStyle">normal</item>

Itálico condensado :

<item name="android:fontFamily">sans-serif-condensed</item>
<item name="android:textStyle">italic</item>

Condensado em negrito :

<item name="android:fontFamily">sans-serif-condensed</item>
<item name="android:textStyle">bold</item>

Condensado em negrito-itálico :

<item name="android:fontFamily">sans-serif-condensed</item>
<item name="android:textStyle">bold|italic</item>

Adicionado no Android Lollipop (v5.0) - API 21:

Médio :

<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textStyle">normal</item>

Itálico médio :

<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textStyle">italic</item>

Preto :

<item name="android:fontFamily">sans-serif-black</item>
<item name="android:textStyle">italic</item>

Para referência rápida, é assim que todos se parecem:

Ahmad
fonte
2
Haha: O DI realmente sabia sobre o site antes disso, então não foi difícil encontrá-lo. Mas, para referência futura: prefiro usar a pesquisa no developer.android.com sobre a pesquisa do Google, pois você pode limitar a pesquisa apenas às APIs, postagens do blog, notas de versão etc.
Ahmad
8
E se você estiver interessado: Este é o lugar onde as fontes são definidas. Esta classe carrega as fontes e esta as gerencia em estado de abandono.
Ahmad
1
@androiddeveloper done. O preto Roboto não se refere à cor da fonte, mas é apenas uma versão "mais ousada" do Roboto Bold. Adicionei uma imagem de referência na parte inferior.
Ahmad
1
@ Ahmad Obrigado por esclarecer isso. Aqui está o seu +1 ... :)
desenvolvedor Android
2
Além disso, existe um monte de alias para usar com o fontFamily android.googlesource.com/platform/frameworks/base/+/master/data/…
Pauland
110

Fontes disponíveis (a partir do Oreo)

Visualização de todas as fontes

A página Tipografia de design de material tem demos para algumas dessas fontes e sugestões sobre como escolher fontes e estilos.

Para detetives do código: fonts.xmlé a lista definitiva e em constante expansão de fontes do Android.


Usando essas fontes

Defina os atributos android:fontFamilye android:textStyle, por exemplo

<!-- Roboto Bold -->
<TextView
    android:fontFamily="sans-serif"
    android:textStyle="bold" />

para os valores desejados desta tabela:

Font                     | android:fontFamily          | android:textStyle
-------------------------|-----------------------------|-------------------
Roboto Thin              | sans-serif-thin             |
Roboto Light             | sans-serif-light            |
Roboto Regular           | sans-serif                  |
Roboto Bold              | sans-serif                  | bold
Roboto Medium            | sans-serif-medium           |
Roboto Black             | sans-serif-black            |
Roboto Condensed Light   | sans-serif-condensed-light  |
Roboto Condensed Regular | sans-serif-condensed        |
Roboto Condensed Medium  | sans-serif-condensed-medium |
Roboto Condensed Bold    | sans-serif-condensed        | bold
Noto Serif               | serif                       |
Noto Serif Bold          | serif                       | bold
Droid Sans Mono          | monospace                   |
Cutive Mono              | serif-monospace             |
Coming Soon              | casual                      |
Dancing Script           | cursive                     |
Dancing Script Bold      | cursive                     | bold
Carrois Gothic SC        | sans-serif-smallcaps        |

(Noto Sans é uma fonte alternativa; você não pode especificá-la diretamente)

Nota: esta tabela é derivada de fonts.xml. O nome da família e o estilo de cada fonte estão listados em fonts.xml, por exemplo

<family name="serif-monospace">
    <font weight="400" style="normal">CutiveMono.ttf</font>
</family>

serif-monospaceé, portanto, a família da fonte e normalé o estilo.


Compatibilidade

Com base no log de fonts.xml e no antigo system_fonts.xml , é possível ver quando cada fonte foi adicionada:

  • Sanduíche de sorvete: Roboto regular, negrito, itálico e negrito e itálico
  • Jelly Bean: luz Roboto, itálico claro, condensado, negrito condensado, itálico condensado e itálico negrito condensado
  • Jelly Bean MR1: Roboto fino e fino em itálico
  • Pirulito:
    • Roboto médio, itálico médio, preto e itálico preto
    • Noto Serif regular, negrito, itálico, negrito itálico
    • Cutive Mono
    • Em breve
    • Dancing Script
    • Carrois Gothic SC
    • Noto Sans
  • Oreo MR1: meio condensado Roboto
Newtonx
fonte
1
como você encontrou no log sobre a versão do Android?
desenvolvedor Android
3
@androiddeveloper Eu estava olhando as datas em que cada linha foi adicionada. Para saber exatamente quais fontes estão disponíveis em uma versão específica, consulte system_fonts.xml para essa versão, por exemplo, para Lollipop: android.googlesource.com/platform/frameworks/base/+/…
Newtonx
Minha única queixa sobre isso é que não está em ordem alfabética: p Mas mesmo assim! Essa deve ser a melhor resposta! Obrigado!
T.Woody
9

Tanto quanto sei, você não pode declarar fontes personalizadas em xml ou temas. Normalmente, apenas faço aulas personalizadas estendendo o textview que definem sua própria fonte na instanciação e as utilizo nos meus arquivos XML de layout.

ou seja:

public class Museo500TextView extends TextView {
    public Museo500TextView(Context context, AttributeSet attrs) {
        super(context, attrs);      
        this.setTypeface(Typeface.createFromAsset(context.getAssets(), "path/to/font.ttf"));
    }
}

e

<my.package.views.Museo900TextView
        android:id="@+id/dialog_error_text_header"
        android:layout_width="190dp"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:textSize="12sp" />
Tropeçou
fonte
1
Isso pode custar-lhe muita memória em uma reciclagem
Florescu Cătălin