Android应用程序的自定义字体

时间:2016-09-16 12:09:01

标签: java android fonts

我尝试在我的应用中添加自定义字体。创建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

6 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:1)

您可以在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
    }
通过这种方式,您可以轻松管理您的代码。

答案 2 :(得分:0)

像这样创建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

中的视图
 <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" />

答案 3 :(得分:0)

如果您希望整个应用程序使用特定字体,请使用此库 Check here

答案 4 :(得分:0)

首先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);

答案 5 :(得分:0)

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>
相关问题