package com.buddycloud.customviews; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Paint; import android.graphics.Typeface; import android.support.v4.util.LruCache; import android.text.TextUtils; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.EditText; import com.buddycloud.R; import com.buddycloud.utils.TypefacesUtil; /** * Create a edittext with custom typeface. * * <code> * <com.buddycloud.customviews.TypefacedEditText * android:id="@+id/createAccountBtn" * android:text="@string/create_account_button" * buddycloud:typeface="Roboto-Regular.ttf" /> * </code> * * @author Adnan Urooj (Deminem) * */ public class TypefacedEditText extends EditText { private static LruCache<String, Typeface> sTypefaceCache = new LruCache<String, Typeface>(12); private static final String FONTS_PATH = "fonts/"; private KeyImeChange keyImeChangeListener; public TypefacedEditText(Context context) { super(context); } public TypefacedEditText(Context context, AttributeSet attrs) { super(context, attrs); applyFonts(context, attrs); } public TypefacedEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); applyFonts(context, attrs); } private void applyFonts(Context context, AttributeSet attrs) { // Get our custom attributes TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Typefaced, 0, 0); try { String fontName = a.getString(R.styleable.Typefaced_typeface); if (!isInEditMode() && !TextUtils.isEmpty(fontName)) { Typeface typeface = sTypefaceCache.get(fontName); if (typeface == null) { typeface = TypefacesUtil.get(context, FONTS_PATH + fontName); // Cache the Typeface object sTypefaceCache.put(fontName, typeface); } setTypeface(typeface); // Note: This flag is required for proper typeface rendering setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); } } finally { a.recycle(); } } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection connection = super.onCreateInputConnection(outAttrs); int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION; // if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) { // // clear the existing action // outAttrs.imeOptions ^= imeActions; // // set the DONE action // outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE; // } if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) { outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; } return connection; } @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (keyImeChangeListener != null) { return keyImeChangeListener.onKeyPreIme(keyCode, event); } return false; } public void setOnKeyPreImeListener(KeyImeChange listener) { this.keyImeChangeListener = listener; } public interface KeyImeChange { public boolean onKeyPreIme(int keyCode, KeyEvent event); } }