2015-06-10 12 views
16

Qualcuno ha provato a cambiare il carattere dell'etichetta mobile? Ho cambiato la fonte del EditText ma il carattere del marchio galleggiante non è cambiata, sono molto grato a coloro che mi aiutanoCambia il carattere dell'etichetta mobile EditText e TextInputLayout

Codice:

   <android.support.design.widget.TextInputLayout 
        android:id="@+id/tilTextoDescricao" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_toRightOf="@id/tilValorUnidade" 
        android:layout_marginTop="10dp"> 

        <EditText 
         android:id="@+id/etTextoDescricao" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:layout_marginLeft="5dp" 
         android:hint="Descrição" 
         android:textSize="15dp" 
         android:inputType="text" /> 

       </android.support.design.widget.TextInputLayout> 

----------------- 

    etTextoDescricao= (EditText) findViewById(R.id.etTextoDescricao); 
    etTextoDescricao.setTypeface(CustomTypeface.getTypefaceMediumDefault(this)); 

enter image description here

risposta

18

Purtroppo, dovrete usare la riflessione per gestire questo.

L'etichetta mobile viene disegnata da CollapsingTextHelper, che è una classe interna, pacchetto-privata e non è impostata per gestire gli span. Quindi, usare qualcosa come una custom TypefaceSpan non funzionerà in questo caso.

Poiché ciò utilizza la riflessione, non è garantito che funzioni in futuro.

Attuazione

final Typeface tf = Typeface.createFromAsset(getAssets(), "your_custom_font.ttf"); 
final TextInputLayout til = (TextInputLayout) findViewById(R.id.yourTextInputLayout); 
til.getEditText().setTypeface(tf); 
try { 
    // Retrieve the CollapsingTextHelper Field 
    final Field cthf = til.getClass().getDeclaredField("mCollapsingTextHelper"); 
    cthf.setAccessible(true); 

    // Retrieve an instance of CollapsingTextHelper and its TextPaint 
    final Object cth = cthf.get(til); 
    final Field tpf = cth.getClass().getDeclaredField("mTextPaint"); 
    tpf.setAccessible(true); 

    // Apply your Typeface to the CollapsingTextHelper TextPaint 
    ((TextPaint) tpf.get(cth)).setTypeface(tf); 
} catch (Exception ignored) { 
    // Nothing to do 
} 

vista Errore

Se avete bisogno di cambiare il tipo di carattere dell'errore, si potrebbe fare una delle due cose:

  1. utilizzare la riflessione grab l'errore TextView e applicare lo Typeface molto prima dello
  2. Utilizzare uno span personalizzato. A differenza dell'etichetta mobile, la vista di errore utilizzata da TextInputLayout è solo una TextView, quindi è in grado di gestire le estensioni.

Utilizzando riflessione

final Field errorField = til.getClass().getDeclaredField("mErrorView"); 
errorField.setAccessible(true); 
((TextView) errorField.get(til)).setTypeface(tf); 

Utilizzando un arco personalizzato

final SpannableString ss = new SpannableString("Error"); 
ss.setSpan(new FontSpan(tf), 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
til.setError(ss); 

private static final class FontSpan extends MetricAffectingSpan { 

    private final Typeface mNewFont; 

    private FontSpan(Typeface newFont) { 
     mNewFont = newFont; 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setTypeface(mNewFont); 
    } 

    @Override 
    public void updateMeasureState(TextPaint paint) { 
     paint.setTypeface(mNewFont); 
    } 

} 

Risultati

results

Il carattere che sto utilizzando è Smoothie Shoppe.

+3

Non bella, ma super utile per ora, grazie! – StingRay5

+1

Dio ti benedica! Salvato me –

+0

Come posso usarlo in classe singola, il mio problema è che ho così tanti layout, quindi tutto il tempo che devo usare questo codice in tutte le classi è per questo che sto chiedendo. È possibile? –

5

Ecco un'implementazione di classe personalizzata per adneal's answer.

public class CustomTextInputLayout extends TextInputLayout { 

    public CustomTextInputLayout(Context context) { 
     super(context); 
     initFont(context); 
    } 

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

    private void initFont(Context context) { 
     final Typeface typeface = Typeface.createFromAsset(
       context.getAssets(), "fonts/YOUR_CUSTOM_FONT.ttf"); 

     EditText editText = getEditText(); 
     if (editText != null) { 
      editText.setTypeface(typeface); 
     } 
     try { 
      // Retrieve the CollapsingTextHelper Field 
      final Field cthf = TextInputLayout.class.getDeclaredField("mCollapsingTextHelper"); 
      cthf.setAccessible(true); 

      // Retrieve an instance of CollapsingTextHelper and its TextPaint 
      final Object cth = cthf.get(this); 
      final Field tpf = cth.getClass().getDeclaredField("mTextPaint"); 
      tpf.setAccessible(true); 

      // Apply your Typeface to the CollapsingTextHelper TextPaint 
      ((TextPaint) tpf.get(cth)).setTypeface(typeface); 
     } catch (Exception ignored) { 
      // Nothing to do 
     } 
    } 
} 

nei file XML ora è necessario utilizzare CustomTextInputLayout invece di TextInputLayout e funzionerà fuori dalla scatola.

<your.package.CustomTextInputLayout 
    android:id="@+id/textInputLayout_email" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <AutoCompleteTextView 
     android:id="@+id/editText_email" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/hint_email" 
     android:inputType="textEmailAddress" /> 

Grazie adneal per la risposta.

24

A partire da Design Library v23, è possibile utilizzare TextInputLayout#setTypeface().

Questo imposterà il carattere tipografico sul suggerimento esteso e mobile.

Qui è il feature request dove è stato discusso su b.android.com.

EDIT: Il carattere tipografico vista errore non era stato impostato, ma ora è in fixedv25.1.0.

+1

Ho fatto questo e ha funzionato per tutto tranne la visualizzazione degli errori. Penso che la textappearance la sovrascriva, quindi probabilmente è un bug di qualche tipo. Per indirizzare la vista errori in modo specifico, è possibile utilizzare l'ID indicato da Android per fare riferimento in questo modo: ** ((TextView) inputLayout.findViewById (R.id.textinput_error)). SetTypeface (customFont); ** –

+0

@ JustinLiu Il tuo problema è stato risolto nella Libreria di supporto v25.1.0 - https://code.google.com/p/android/issues/detail?id=227803 –

1

risolvere un problema in risposta @adneal: se setErrorEnabled non è impostato su true, mErrorView sarebbe nullo e se lo si imposta in modo falso in qualsiasi punto il carattere tornerebbe al valore predefinito. modo per risolvere il problema:

in voi esclusione TextInputLayout personalizzato setErrorEnabled

@Override 
public void setErrorEnabled(boolean enabled) { 

    super.setErrorEnabled(enabled); 

    if (enabled) { 

     try { 

      Field cthf = TextInputLayout.class.getDeclaredField("mErrorView"); 
      cthf.setAccessible(true); 

      TextView error = (TextView) cthf.get(this); 

      if (error != null) 
       error.setTypeface(tf); 


     } catch (Exception e) { 

     } 
    } 
} 
0
final Typeface tf = Typeface.createFromAsset(getAssets(), "your_custom_font.ttf"); 
final TextInputLayout til = (TextInputLayout) findViewById(R.id.yourTextInputLayout); 
til.getEditText().setTypeface(tf); 
til.setTypeface(tf); 
+0

Spiega qualcosa sul tuo approccio – etalon11

+0

@ etalon11, una textview o modifica del testo essere avvolto in un 'TextInputLayout' e applicare una faccia di tipo per' TextInputLayout' alla fine applicherà gli attributi ad esso figli. Credo che funzionerà. – Satty

+0

TextInputLayout member mEditText che getEditText() restituisce è diverso da mErrorView che è un TextView. Questo non dovrebbe funzionare, per favore controlla. –

5

Ho appena trovato una soluzione semplice e ha funzionato per me:

in questo modo è possibile impostare il tipo di carattere accennare di qualsiasi modifica del testo:

in layout.xml:

<android.support.design.widget.TextInputLayout 
      android:id="@+id/text_input1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <EditText 
       android:id="@+id/edt_user" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/username"/> 
     </android.support.design.widget.TextInputLayout> 

e in classe Java:

public class MainActivity extends AppCompatActivity { 

EditText editText; 
TextInputLayout textInputLayout; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Typeface font_yekan= Typeface.createFromAsset(getAssets(), "fonts/byekan.ttf"); 
     textInputLayout= (TextInputLayout) findViewById(R.id.text_input1); 
    textInputLayout.setTypeface(font_yekan); 
     } 
} 
+0

Eccellente. Ha funzionato per me. –

+1

Strano, questo avrebbe dovuto funzionare per me. Ho usato un layout di input di testo personalizzato e ho solo cambiato il carattere durante l'inizializzazione usando setTypeface() e la vista di errore ha ancora la precedente. Questo è strano dato che è lì nel codice che la vista errori prende anche il carattere tipografico in setTypeface(). Qualche idea di cosa potrei mancare? –

0

Ecco come ho raggiungere questo

edit_login_emailOrPhone.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(hasFocus) 
      { 
       textInputLayout_login_emailOrPhone.setTypeface(APSApplication.getInstance().getFonts().getTypefaceSemiBold()); 
      }else 
      { 
       textInputLayout_login_emailOrPhone.setTypeface(APSApplication.getInstance().getFonts().getTypefaceRegular()); 
      } 
     } 
    }); 
Problemi correlati