Preciso usar certa fonte para todo o meu aplicativo. Eu tenho o arquivo .ttf para o mesmo. É possível definir isso como fonte padrão, na inicialização do aplicativo e depois usá-lo em outro lugar no aplicativo? Quando definido, como usá-lo em meus XMLs de layout?
java
android
android-fonts
Samuh
fonte
fonte
Respostas:
Sim com reflexão. Isso funciona (com base nesta resposta ):
(Observação: esta é uma solução alternativa devido à falta de suporte para fontes personalizadas; portanto, se você quiser alterar essa situação, faça uma votação positiva para o problema do Android aqui ). Nota: Não deixe comentários "eu também" sobre esse problema; todos os que o visualizaram receberão um email quando você fizer isso. Então, basta "estrelar", por favor.
Você precisa sobrecarregar as poucas fontes padrão, por exemplo, em uma classe de aplicativo :
Ou, é claro, se você estiver usando o mesmo arquivo de fonte, poderá melhorar isso para carregá-lo apenas uma vez.
No entanto, costumo substituir um, digamos
"MONOSPACE"
, e configurar um estilo para forçar esse aplicativo de tipo de fonte:API 21 Android 5.0
Investiguei os relatórios nos comentários de que ele não funciona e parece incompatível com o tema
android:Theme.Material.Light
.Se esse tema não for importante para você, use um tema mais antigo, por exemplo:
fonte
"DEFAULT_BOLD"
também um campo privado:private static Typeface[] sDefaults;
você pode tentar acessar isso refletindo e definindo o seu tiposDefaults[Typeface.ITALIC]
de letra. Veja isso.TextView
todos os lugares para usar fontes personalizadas ou usar uma solução baseada em reflexão como esta. Combinado com o conjunto limitador de fontes disponíveis no Android, torna o desenvolvimento de aplicativos de boa aparência muito trabalhoso. Adicionei uma solicitação de recurso ao rastreador de problemas do Android. Se você quiser ver esse recurso, poderá marcarHá uma ótima biblioteca de fontes personalizadas no Android: Caligrafia
Aqui está um exemplo de como usá-lo.
Em Gradle, você precisa colocar esta linha no arquivo build.gradle do seu aplicativo:
e faça uma classe que estenda
Application
e escreva este código:e na classe de atividade, coloque esse método antes de onCreate:
e a última coisa que seu arquivo de manifesto deve ter esta aparência:
e isso mudará toda a atividade para sua fonte! é simples e limpo!
fonte
<b></b>
,<u></u>
e<i></i>
nostrings.xml
arquivo e até agora ele funciona.Enquanto isso não funcionaria para um aplicativo inteiro, funcionaria para uma Atividade e poderia ser reutilizado para qualquer outra Atividade. Atualizei meu código graças a @ FR073N para oferecer suporte a outros modos de exibição. Não tenho certeza sobre problemas com
Buttons
,RadioGroups
etc. porque todas essas classes se estendemTextView
para que funcionem bem. Eu adicionei uma condicional booleana para o uso da reflexão, porque parece muito imprudente e pode comprometer notavelmente o desempenho.Nota: como indicado, isso não funcionará para conteúdo dinâmico! Para isso, é possível chamar esse método com say an
onCreateView
ougetView
method, mas requer esforço adicional.Então, para usá-lo, você faria algo assim:
Espero que ajude.
fonte
Em suma:
Opção 1: use a reflexão para aplicar a fonte (combinando a resposta de weston e Roger Huang ):
Uso na classe Aplicativo:
configure um estilo para forçar esse aplicativo de tipo de fonte (com base no lovefish ):
Pré-pirulito:
Pirulito (API 21):
Opção2: Subclasse toda e qualquer visualização em que você precise personalizar a fonte, por exemplo. ListView, EditTextView, Button, etc. ( resposta de Palani ):
Opção 3: implemente um rastreador de exibição que atravessa a hierarquia de exibição da tela atual:
Variação # 1 ( resposta de Tom ):
Uso:
Variação 2: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Opção 4: Use Lib de terceiros chamada Caligrafia .
Pessoalmente, eu recomendaria a opção 4, pois economiza muitas dores de cabeça.
fonte
"sans-serif"
innewMap.put(
emonospace
instyles
?! Eu quero usar uma fonte personalizada chamadabarana.ttf
.Gostaria de melhorar a resposta da weston para a API 21 Android 5.0.
Causa
Na API 21, a maioria dos estilos de texto inclui a configuração fontFamily, como:
O que aplica a fonte padrão Roboto Regular:
A resposta original falha ao aplicar a fonte monoespaçada, porque android: fontFamily tem maior prioridade ao atributo android: tipo de letra ( referência ). O uso de Theme.Holo. * É uma solução válida, porque não há configurações android: fontFamily dentro.
Solução
Como o Android 5.0 coloca a fonte do sistema na variável estática Typeface.sSystemFontMap ( referência ), podemos usar a mesma técnica de reflexão para substituí-la:
fonte
Button
títulos de barra de ferramentas. Eu estou substituindo a fonte padrão no MainApplication da seguinte forma:FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
. Estou usando o Nexus 5, v5.1.1Build.VERSION.SDK_INT == 21
- Isso é apenas noAPI 21
teste I no Nexus com API 22é muito simples ... 1. Faça o download e coloque sua fonte personalizada em assets..thent, escreva uma classe separada para a exibição de texto da seguinte maneira: aqui eu usei fonte futura
}
e faça o seguinte em xml:
fonte
Eu também sugeriria estender o TextView e outros controles, mas seria melhor considerar configurar a fonte nas construções.
fonte
Gostaria de melhorar as respostas de weston e Roger Huang para mais de pirulito Android API 21 com o tema " Theme.AppCompat ".
Abaixo do Android 4.4
API sobre (igual) 5.0
E o arquivo utilitário FontsOverride é o mesmo que na resposta de weston . Eu testei nestes telefones:
Nexus 5 (sistema Android primário do Android 5.1)
ZTE V5 (android 5.1 CM12.1)
Nota XIAOMI (android 4.4 MIUI6)
HUAWEI C8850 (android 2.3.5 DESCONHECIDO)
fonte
Uma solução brilhante pode ser encontrada aqui: https://coderwall.com/p/qxxmaa/android-use-a-custom-font-everywhere .
Simplesmente estenda as atividades do BaseActivity e escreva esses métodos. Além disso, você deve armazenar em cache melhor as fontes, conforme descrito aqui: https://stackoverflow.com/a/16902532/2914140 .
Após algumas pesquisas, escrevi um código que funciona no Samsung Galaxy Tab A (Android 5.0). Código usado de weston e Roger Huang, bem como https://stackoverflow.com/a/33236102/2914140 . Também testado no Lenovo TAB 2 A10-70L, onde não funciona. Eu inseri uma fonte 'Comic Sans' aqui para ver a diferença.
Para executar o código em todo o aplicativo, você deve escrever em alguma classe como Application, o seguinte:
Crie uma pasta 'fontes' dentro de 'ativos' e coloque as fontes necessárias lá. Uma instrução simples pode ser encontrada aqui: https://stackoverflow.com/a/31697103/2914140 .
O dispositivo Lenovo também obtém incorretamente o valor de um tipo de letra. Na maioria das vezes, ele retorna Typeface.NORMAL, às vezes nulo. Mesmo se um TextView estiver em negrito (no layout do arquivo xml). Veja aqui: TextView isBold sempre retorna NORMAL . Dessa forma, um texto na tela está sempre em uma fonte regular, não em negrito ou itálico. Então eu acho que é um bug de um produtor.
fonte
Trabalhando para o Xamarin.Android:
Classe:
Implementação de aplicativo:
Estilo:
fonte
A partir do Android O, agora é possível definir diretamente a partir do XML e meu bug está encerrado!
Veja aqui para detalhes
TL; DR:
Primeiro você deve adicionar suas fontes ao projeto
Segundo, você adiciona uma família de fontes, assim:
Por fim, você pode usar a fonte em um layout ou estilo:
Aproveitar!
fonte
Você pode definir fontes personalizadas para cada layout, uma por uma, com apenas uma chamada de função de cada layout, passando sua raiz View.First, crie uma abordagem de singelton para acessar o objeto de fonte como este
Você pode definir fontes diferentes na classe acima. Agora, defina uma classe auxiliar de fonte que aplicará fontes:
No código acima, estou aplicando fontes somente no textView e no EditText, você pode aplicar fontes em outros elementos de exibição também. Você só precisa passar o ID do seu grupo de exibição raiz para o método de fonte acima aplicado. por exemplo, seu layout é:
No layout acima, o ID principal raiz é "Principal pai" agora permite aplicar fonte
Felicidades :)
fonte
Sugiro estender o TextView e sempre usar o TextView personalizado em seus layouts XML ou onde você precisar de um TextView. No seu TextView personalizado, substitua
setTypeface
fonte
A solução de Tom funciona muito bem, mas funciona apenas com TextView e EditText.
Se você deseja cobrir a maioria das visualizações (RadioGroup, TextView, Checkbox ...), criei um método fazendo isso:
Este método recuperará o estilo da exibição definida em XML (negrito, itálico ...) e os aplicará, se existirem.
Para o ListView, eu sempre crio um adaptador e defino a fonte dentro de getView.
fonte
Eu escrevi uma classe atribuindo o tipo de letra às visualizações na hierarquia de visualizações atual e com base nas propriedades atuais (negrito, normal, você pode adicionar outros estilos, se desejar):
Agora, em todos os fragmentos em onViewCreated ou onCreateView, em todas as atividades em onCreate e em todos os adaptadores de exibição em getView ou newView, basta chamar:
fonte
na API 26 com build.gradle 3.0.0 e superior, você pode criar um diretório de fontes em res e usar esta linha em seu estilo
para alterar build.gradle, use isso em suas dependências build.gradle
fonte
item
si só não define a fonte para todo o aplicativo. qualquer pista?Por fim, o Google percebeu a gravidade desse problema (aplicando fonte personalizada aos componentes da interface do usuário) e criou uma solução limpa para ele.
Primeiro, você precisa atualizar para dar suporte à biblioteca 26+ (também pode ser necessário atualizar seu gradle {4.0+}, android studio) e depois criar uma nova pasta de recursos chamada fonte. Nesta pasta, você pode colocar seus recursos de fonte (.tff, ...). Em seguida, você precisa substituí-los pelo aplicativo padrão e forçar sua fonte personalizada para ele :)
Nota: se você deseja oferecer suporte a dispositivos com API anterior a 16, é necessário usar o namespace do aplicativo em vez do android!
fonte
Também gostaria de melhorar a resposta da weston para a API 21 Android 5.0.
Eu tive o mesmo problema no meu Samsung s5, ao usar a fonte DEFAULT. (com as outras fontes, está funcionando bem)
Consegui fazê-lo funcionar definindo o tipo de letra ("sans", por exemplo) em arquivos XML, para cada Textview ou Button
e na classe MyApplication:
Espero que ajude.
fonte
Esta solução não funciona corretamente em algumas situações.
Então eu o estendo:
FontsReplacer.java
https://gist.github.com/orwir/6df839e3527647adc2d56bfadfaad805
fonte
A caligrafia funciona muito bem, mas não é adequada para mim, pois não suporta pesos diferentes (negrito, itálico etc.) para uma família de fontes.
Então, tentei o Fontain , que permite definir Visualizações personalizadas e aplicá-las a famílias de fontes personalizadas.
para usar o Fontain, você deve adicionar o seguinte ao seu módulo de aplicativo build.gradle:
Em vez de usar o TextView comum, você deve usar FontTextView
Exemplo de FontTextView com conteúdo em maiúscula e negrito:
fonte
fonte
TextView
sPara alterar a família de fontes padrão dos TextViews, substitua textViewStyle no tema do seu aplicativo.
Para usar fontes personalizadas em fontFamily, use os recursos de fonte que estão na biblioteca de suporte.
O recurso foi adicionado no Android 26, mas suportado para versões mais antigas via supportlib.
https://developer.android.com/guide/topics/resources/font-resource.html https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html # using-support-lib
fonte
Desde o lançamento do Android Oreo e sua biblioteca de suporte (26.0.0), você pode fazer isso facilmente. Consulte esta resposta em outra pergunta.
Basicamente, seu estilo final ficará assim:
fonte
Encontrei a mistura da biblioteca de caligrafia 3 e do post da coderwall como meu resultado final.
fonte
Sim, é possível definir a fonte para todo o aplicativo.
A maneira mais fácil de fazer isso é empacotar a (s) fonte (s) desejada (s) com seu aplicativo.
Para fazer isso, basta criar uma pasta / ativos na raiz do projeto e colocar suas fontes (no formato TrueType ou TTF) nos ativos.
Você pode, por exemplo, criar ativos / fontes / e colocar seus arquivos TTF lá.
fonte