O Android não fornece um mecanismo para usar um arquivo de fonte personalizada (TTF, OTF, etc) em todas as áreas do seu aplicativo. Em vez disso, você deve empregar uma estratégia para definir um costume Typeface
em todos os TextView
s, EditText
s e Button
s.
Esta postagem cobre uma estratégia que deve atender às suas necessidades de aplicativos comuns.
The View Crawler
Layouts (e sub-layouts) no Android são hierarquias de árvore compostas de ViewGroup
s como elementos compostos e View
s como nós folha. Esta árvore pode ser rastreada visitando visualizações filhas em sua ordem favorita (largura primeiro ou profundidade primeiro). Ao rastejar nesta árvore, pode-se substituir todos os Typeface
s em qualquer TextView
s, EditText
s e Button
s que forem encontrados.
Aqui está uma implementação recursiva simples de um rastreador de visualização que substituirá o Typeface
de qualquer visualização apropriada na hierarquia:
public class FontChangeCrawler
{
private Typeface typeface;
public FontChangeCrawler(Typeface typeface)
{
this.typeface = typeface;
}
public FontChangeCrawler(AssetManager assets, String assetsFontFileName)
{
typeface = Typeface.createFromAsset(assets, assetsFontFileName);
}
public void replaceFonts(ViewGroup viewTree)
{
View child;
for(int i = 0; i < viewTree.getChildCount(); ++i)
{
child = viewTree.getChildAt(i);
if(child instanceof ViewGroup)
{
// recursive call
replaceFonts((ViewGroup)child);
}
else if(child instanceof TextView)
{
// base case
((TextView) child).setTypeface(typeface);
}
}
}
}
Substitua o tipo de letra da atividade inteira
Para substituir a fonte padrão em todas as visualizações do layout de uma atividade, basta usar o FontChangeCrawler
acima, da seguinte forma:
@Override
public void setContentView(View view)
{
super.setContentView(view);
FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets(), "font.otf");
fontChanger.replaceFonts((ViewGroup)this.findViewById(android.R.id.content));
}
Se você não estiver familiarizado com android.R.id.content
, é o ID oficial fornecido ao root View
em um Activity
layout de.
Considere colocar a lógica acima em uma BaseActivity
classe.
Substituir o tipo de letra do Fragment
Você também precisará aplicar o FontChangeCrawler
a cada um Fragment
. Considere colocar essa lógica em uma BaseFragment
classe.
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets(), "font.otf");
fontChanger.replaceFonts((ViewGroup) this.getView());
}
Adaptadores de manuseio, etc.
Substituir Activity
fontes é um longo caminho, mas a maioria de nós também tem uma infinidade de fontes ListView
. Os itens da lista em a ListView
são construídos em um adaptador, não em um Activity
. Portanto, você também precisará usar o FontChangeCrawler
em seus adaptadores:
...
if(convertView == null)
{
convertView = inflater.inflate(R.layout.listitem, null);
fontChanger.replaceFonts((ViewGroup)convertView);
}
...
O que não foi tratado?
Vou deixar o manuseio do ActionBar como um exercício para o leitor. Além disso, considere como você pode lidar com widgets cujo tipo de letra você não deseja alterar.