簡體   English   中英

Android應用程序的自定義字體

[英]Custom Font for an Android App

我試圖在我的應用程序中添加自定義字體。 創建typeface對象並將字體放入其中的方法有效。 現在,我想為自定義字體創建一個類,以使用更簡潔的代碼。

CustomFont.java

public class CustomFont extends AppCompatActivity {

    private final Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/Slabo.ttf");

    public CustomFont(TextView textView) {
        textView.setTypeface(typeface);
    }
}

現在我正在嘗試將此字體添加到textview

    public class MainActivity extends AppCompatActivity {

    private Typeface typeface;
    private CustomFont customFont;
    private TextView textview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //typeface = Typeface.createFromAsset(getAssets(),  "fonts/Slabo.ttf"); // works
        textview = (TextView) findViewById(R.id.textviewTest);
        //textview.setTypeface(typeface); // works

        customFont = new CustomFont(textview);   // does not work

    }
}

但是,如果我運行此項目,則會出現以下異常:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.AssetManager android.content.Context.getAssets()' on a null object reference

嘗試這個 :

TextView text = (TextView) findViewById(R.id.custom_font);
Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf");
text.setTypeface(font);

您可以在commonUtill類中制作如下所示的方法,以進行更好的說明

 public static void setTypeface(Context mContext, View view, VIEW_TYPE type,
                                   TYPE_FACE face, int bold) {
        View mView = view;
        Typeface tface = getTypeface(mContext, face);
        switch (type) {
            case TEXTVIEW:
                ((TextView) mView).setTypeface(tface, bold);
                break;
            case BUTTON:
                ((Button) mView).setTypeface(tface, bold);
                break;
            case EDITTEXT:
                ((EditText) mView).setTypeface(tface, bold);
                break;
            case RADIOBUTTON:
                ((RadioButton) mView).setTypeface(tface, bold);
                break;
            case CHECKBOX:
                ((CheckBox) mView).setTypeface(tface, bold);
                break;
            case CHECKEDTEXTVIEW:
                ((CheckedTextView) mView).setTypeface(tface, bold);
                break;
            default:
                break;
        }

    }

並創建這樣的功能

public static enum TYPE_FACE {
        CALIBRI, ICON_FONT, BEBAS, AWESOME, BT, TAGLINE,
         CALLIBRI, WEBLYSLEEK, WEBLYSLEEK_BOLD, ICON_FONT1

    }

和您的查看方法。

public static enum VIEW_TYPE {
        TEXTVIEW, BUTTON, EDITTEXT, RADIOBUTTON, CHECKBOX, CHECKEDTEXTVIEW
    }

通過這種方式,您可以輕松地管理代碼。

創建這樣的Java類。

public class TextViewKarlaBold extends TextView {
    public TextViewKarlaBold(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

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

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

    public void init() {
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
                "fonts/Karla-Bold.ttf");
        setTypeface(tf, 1);
    }
}

將此類用作XML View

 <hammerapps.views.TextViewKarlaBold // hammerapps.views is My Package name
                android:id="@+id/txtVIEW"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:gravity="center"
                android:text="VIEW"
                android:textColor="@color/black"
                android:textSize="12dp" />

如果您希望整個應用程序使用特定字體, 使用此庫。

首先CustomFont不應該是活動的,應該是普通班級。

public class CustomFont {

    private Typeface typeface;
    public CustomFont(Context context) {
        typeface = Typeface.createFromAsset(context.getAssets(), "fonts/Slabo.ttf");
    }
    public void setFont(TextView textView) {
        textView.setTypeface(typeface);
    }
}

並從您的MainActivity中調用它

customFont = new CustomFont(this);
customFont.setFont(textview);
Use Custom Textview

public class TextView extends android.widget.TextView {
Context mContext;
String str;
boolean isCorner;
//fonts
public static Typeface Font_name;

public TextView(Context context)  {
    super(context);
    mContext=context;
    initialiseFont(null);
}





public TextView(Context context, AttributeSet attrs, int defStyleAttr)  {
    super(context, attrs, defStyleAttr);
    mContext=context;
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TextView, 0, 0);
    try {
        str = ta.getString(R.styleable.TextView_font_family);
        isCorner=ta.getBoolean(R.styleable.TextView_isCorner,false);
    } finally {
        ta.recycle();
    }
    initialiseFont(str);
}


private void initialiseFont(String font)  {

    if(font==null || font.equals("")){

    }
    else {

            Font_name = Typeface.createFromAsset(mContext.getAssets(), "DroidSansFallbackanmol256.ttf");
            setTypeface(Font_name);

}

}

使用attrs.xml

 <declare-styleable name="TextView">
    <attr name="font_family" format="string"/>
    <attr name="isCorner" format="boolean"/>
</declare-styleable>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM