Eu adicionei um arquivo de fonte personalizada à minha pasta de recursos / fontes. Como faço para usá-lo no meu XML?
Posso usá-lo a partir do código da seguinte maneira:
TextView text = (TextView) findViewById(R.id.textview03);
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf");
text.setTypeface(tf);
Não posso fazer isso a partir de XML usando um android:typeface="/fonts/Molot.otf"
atributo?
Respostas:
Resposta curta: Não. O Android não tem suporte integrado para aplicar fontes personalizadas a widgets de texto por meio de XML.
No entanto, há uma solução alternativa que não é muito difícil de implementar.
Primeiro
Você precisará definir seu próprio estilo. Em sua pasta / res / values, abra / crie o arquivo attrs.xml e adicione um objeto declare estilizável como:
Segundo
Supondo que você queira usar esse widget com frequência, você deve configurar um cache simples para os
Typeface
objetos carregados , já que carregá-los da memória em tempo real pode levar algum tempo. Algo como:Este permitirá que você use extensões de arquivo .ttc, mas não foi testado.
Terceiro
Crie uma nova classe com subclasses
TextView
. Este exemplo em particular leva em conta o tipo de letra XML definido (bold
,italic
, etc.) e aplicá-lo à fonte (supondo que você está usando um arquivo .ttc).Finalmente
Substitua as instâncias de
TextView
em seu XML pelo nome de classe totalmente qualificado. Declare seu namespace personalizado exatamente como faria com o namespace do Android. Observe que o "typefaceAsset" deve apontar para um arquivo .ttf ou .ttc contido em seu diretório / assets.fonte
Aqui está um exemplo de código que faz isso. Eu tenho a fonte definida em uma variável final estática e o arquivo da fonte está no diretório de ativos.
fonte
Crie seu TextView personalizado pertencente à fonte que você deseja usar. Nesta aula, uso um campo estático mTypeface para armazenar em cache o Typeface (para melhor desempenho)
No arquivo xml:
Na classe java:
fonte
Activity implementa LayoutInflater.Factory2 que fornece callbacks em cada View criado. É possível definir o estilo do TextView com o atributo Família de fonte personalizada, carregar os tipos de fonte sob demanda e chamar setTypeface em visualizações de texto instanciadas automaticamente.
Infelizmente, devido ao relacionamento arquitetônico das instâncias do Inflater relativas a Activities e Windows, a abordagem mais simples para usar fontes personalizadas no Android é armazenar em cache as fontes carregadas no nível do aplicativo.
O exemplo de base de código está aqui:
https://github.com/leok7v/android-textview-custom-fonts
resulta em
fonte
Não é uma boa ideia usar fontes personalizadas em xml devido ao fato de que você tem que fazer isso programaticamente para evitar vazamento de memória!
fonte
Talvez você possa usar a reflexão para injetar / hackear sua fonte na lista estática de fontes disponíveis quando seu aplicativo é criado? Estou interessado no feedback de outras pessoas se isso for realmente uma ideia muito ruim ou se for uma ótima solução - parece que vai ser um daqueles extremos ...
Consegui injetar meu tipo de fonte personalizado na lista de fontes do sistema com meu próprio nome de família de fonte e, em seguida, especificando esse nome de família de fonte personalizada ("brush-script") como o valor de android: FontFamily em um TextView padrão funcionado em meu LG G4 com Android 6.0.
No meu layout
fonte
MyApplication
classe precisa ser chamada?e adicione um declarável em attrs.xml
e, em seguida, adicione seu customFont like
fonte
Sei que essa é uma pergunta antiga, mas encontrei uma solução muito mais fácil.
Primeiro declare seu TextView em xml como de costume. Coloque sua fonte (TTF ou TTC) na pasta de ativos
Em seguida, basta definir o tipo de letra para sua visualização de texto em seu método onCreate.
Feito.
fonte
A melhor solução é usar (finalmente) introduzido pelo Google um recurso de fonte personalizada nativa em XML. Mas você deve direcionar a API 26. Ela suporta API 16+
https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml
fonte
em vez de xmlns: custom = "schemas.android.com/tools"; você deve usar: xmlns: custom = "schemas.android.com/apk/res-auto"; para usar atributos estilizáveis. Fiz essa alteração e ela está funcionando agora.
fonte