Fontes personalizado e Textview personalizado on Android

votos
17

De um aplicativo eu preciso desenvolver, eu recebi uma fonte específica que tem muitos arquivos como FontName-Regular, FontName-Bold , FontName-lo . Eu preciso usá-lo em todos os TextViews na aplicação. Primeiro eu pensei que era uma tarefa fácil. Olhar sobre SO e encontrou um muito bom tópico: aqui

Então, primeiro eu fiz como:

public static void overrideFonts(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideFonts(context, child);
            }
        } else if (v instanceof TextView) {
            ((TextView)v).setTypeface(FONT_REGULAR);
        }
    } catch (Exception e) {
        e.printStackTrace();
        // ignore
    }
}

E chamou esse método durante onCreate na minha actividade. Cada textView em meu aplicativo estava mostrando que tipo de letra e boy, eu estava feliz por ficar longe tão fácil. Até cheguei a uma tela onde algumas TextViews necessário Negrito como Style( android:textStyle=bold). Então eu percebi que esta solução não fornecer-me com possibilidade de carregar o Font-Bold .ttf dos activos.

Que parecia mais e viu uma boa implementação TextView costume, na mesma pergunta SO:

public class MyTextView extends TextView {

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyTextView(Context context) {
        super(context);
        init();
    }

    public void init() {

        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), font/chiller.ttf);
        setTypeface(tf ,1);

    }
    }

Este parece ainda melhor. A minha pergunta é: como posso detectar no init()caso do meu controle tem um estilo definido para negrito ou não para que eu possa atribuir o tipo solicitado?

Obrigado pelo seu tempo.

LE. Seguindo o exemplo abaixo, eu atualizei minha classe como:

public class MyTextView extends TextView {

    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), Constants.FONT_REGULAR);
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(),  Constants.FONT_BOLD);

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTextView(Context context) {
        super(context);
    }

    public void setTypeface(Typeface tf, int style) {
        if (style == Typeface.BOLD) {
            super.setTypeface(boldTypeface/*, -1*/);
        } else {
            super.setTypeface(normalTypeface/*, -1*/);
        }
    }
}

Bem, se eu depurar, o aplicativo vai em setTypeFace e parece aplicar a uma ousada, mas no meu esquema eu não consigo ver nenhuma mudança, não negrito. Não importa o tipo de letra que eu uso, nenhuma alteração será feita na minha TextView e é exibido com a fonte android padrão. Eu quero saber porque ?

Tenho resumiu tudo em um post aqui no meu blog talvez ele vai ajudar alguém.

Publicado 21/01/2012 em 17:11
fonte usuário
Em outras línguas...                            


3 respostas

votos
25

O construtor de TextViewchamadas setTypeface(Typeface tf, int style)com o styleparâmetro recuperado do atributo XML android:textStyle. Então, se você quer interceptar esta chamada para forçar o seu próprio tipo de letra que você pode substituir esse método como segue:

public void setTypeface(Typeface tf, int style) {
    Typeface normalTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_normal_font.ttf");
    Typeface boldTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/your_bold_font.ttf");

    if (style == Typeface.BOLD) {
        super.setTypeface(boldTypeface/*, -1*/);
    } else {
        super.setTypeface(normalTypeface/*, -1*/);
    }
}
Respondeu 21/01/2012 em 17:49
fonte usuário

votos
9

Você pode usar o meu CustomTextView, que permite que você especifique um nome de arquivo de fonte em sua assetspasta:

https://github.com/mafshin/CustomTextView

e o uso é muito simples:

<com.my.app.CustomTextView
        xmlns:custom="http://schemas.android.com/apk/res/com.my.app"            
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test text"
        android:id="@+id/testcustomview" 

        custom:fontAssetName="Politica XT.otf"
        />
Respondeu 04/08/2013 em 15:14
fonte usuário

votos
2

Eu acho que é melhor para criar o seu próprio pacote de fontes personalizadas e importá-los em seu projeto de modo que você pode usá-los mais tarde no futuro

  package com.codeslips.utilities;  

  import android.content.Context; 
  import android.graphics.Typeface;
  import android.util.AttributeSet;
  import android.widget.TextView;  

  public class CustomTextView extends TextView {  

          public CustomTextView(Context context)
               { super(context); setFont(); }  

          public CustomTextView(Context context,AttributeSet set)
             { super(context,set); setFont(); } 

          public CustomTextView(Context context,AttributeSet set,int defaultStyle) 
             { super(context,set,defaultStyle); setFont(); } 

          private void setFont() { 

           Typeface typeface=Typeface.createFromAsset(getContext().getAssets(),"fonts/your-font.ttf"); 
           setTypeface(typeface); //function used to set font

             }  
          }

Agora use a classe acima em seu arquivo XML para ter sua fonte personalizada

    <com.codeslips.utilities.CustomTextView   
       android:layout_width="wrap_content" 
       android:layout_height="match_parent"
       android:text="Upload Image" 
       android:paddingTop="10sp"
       android:textSize="14sp"
       android:layout_weight="0.7"
       android:textColor="@android:color/white"/>
Respondeu 11/03/2016 em 00:02
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more