如何为文本视图xml布局设置字体

时间:2013-12-26 13:40:38

标签: android textview typeface xml-layout

我创建了一个名为def_list的XML布局。我已为其分配了一个ID,即def_list_textview。我在资源文件夹中放了一个名为bn.ttf的字体。

XML布局如下:

<?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/def_list_textview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="right" >
    </TextView>

但是当我使用代码为它设置字体时:

def_list_tv = (TextView)findViewById(R.id.def_list_textview);
Typeface tf = Typeface.createFromAsset(this.getAssets(), "fonts/bn.ttf");
def_list_tv.setTypeface(tf);

我在LogCat中得到一个nullPointerException。我不知道为什么。

这是我的LogCat:

12-26 17:14:56.496: E/AndroidRuntime(1254): FATAL EXCEPTION: main
12-26 17:14:56.496: E/AndroidRuntime(1254): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.adeveloper.handydic/net.adeveloper.dic.PortDef}: java.lang.NullPointerException
12-26 17:14:56.496: E/AndroidRuntime(1254):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at android.os.Looper.loop(Looper.java:123)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at android.app.ActivityThread.main(ActivityThread.java:3683)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at java.lang.reflect.Method.invokeNative(Native Method)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at java.lang.reflect.Method.invoke(Method.java:507)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at dalvik.system.NativeStart.main(Native Method)
12-26 17:14:56.496: E/AndroidRuntime(1254): Caused by: java.lang.NullPointerException
12-26 17:14:56.496: E/AndroidRuntime(1254):     at net.adeveloper.dic.PortDef.onCreate(PortDef.java:53)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at     android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-26 17:14:56.496: E/AndroidRuntime(1254):     at     android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
12-26 17:14:56.496: E/AndroidRuntime(1254):     ... 11 more

9 个答案:

答案 0 :(得分:3)

问题可能在

this.getAssets()

getAssets()是Context的方法,所以尝试传递上下文对象而不是 this

尝试

Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/bn.ttf");

Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "fonts/bn.ttf");

这里mContext是Context

的对象

编辑:

请检查以下Custom TextView是否可以帮助您

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

  private void init(){
    if(!isInEditMode()){
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/bn.ttf");
        setTypeface(tf);
    }
  }
}

我在之前的一个项目中使用过这个课程

答案 1 :(得分:0)

您的代码似乎很完美 签出,字体名称与您在资产文件夹中写的相同 - &gt;字体文件夹。如果相同,那么尝试将字体直接移动到资产文件夹,这里只需设置“bn.ttf”而不是“fonts / bn.ttf”。

答案 2 :(得分:0)

从fonts /中删除你的字体文件并将其直接放在Assets文件夹中,应该可行! 希望能帮助

答案 3 :(得分:0)

我找到了答案。正如silwar指出的那样,我没有为我的XML布局的内容视图分配活动。我只是使用另一个具有不同内容视图的活动。

但有一个问题。文本视图似乎仍然不适用于所提到的字体。它只使用默认字体。我有一个列表视图的着名XML布局,我想使用我指定的字体。它将字符串添加到ArrayList中,列表视图的适配器使用如下代码:

defListAdapter = new ArrayAdapter<String>(this, R.layout.def_list, list);
defListView.setAdapter(defListAdapter);

def_list是我在上一个问题中指出的XML布局。 defListView是列表视图。为什么我看不到所需的字体?

答案 4 :(得分:0)

你应该注意"fonts/bn.ttf"。所有的话都必须是原型 愿bn.ttf成为BN.TTF。因此请注意assets文件夹并确保原型名称。

答案 5 :(得分:0)

尝试创建如下所示的CustomTextView:

public class CustomTextView extends TextView {

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

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

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

private void init() {
    if (!isInEditMode()) {
        Typeface typeFace = Typeface.createFromAsset(getContext().getAssets(), "fonts/arial.ttf");
        setTypeface(typeFace,Typeface.NORMAL);
    }
}

}

请将您的字体文件放在 assets / fonts / arial.ttf 中,确保CustomTextView java文件中的字体名称必须相同,并从 xml <调用CustomTextView / strong>您可以使用以下代码:

<com.package.name.CustomTextView
//fill in the details
/>

由于

答案 6 :(得分:0)

def_list_tv = (TextView)findViewById(R.id.def_list_textview);   //line no 1
System.out.println("Textview==="+def_list_tv);
Typeface tf = Typeface.createFromAsset(this.getAssets(), "fonts/bn.ttf");
def_list_tv.setTypeface(tf); 

如果你在Logcat中看到 Textview === null ,请在第1行中指定正确的textview id。我遇到了同样的错误。我希望这会有所帮助对你而言。

答案 7 :(得分:0)

请你试试这个......我觉得你的路上有些不对劲的路径

def_list_tv = (TextView)findViewById(R.id.def_list_textview);
Typeface tf = Typeface.createFromAsset(this.getAssets(), "bn.ttf");
def_list_tv.setTypeface(tf,null);

答案 8 :(得分:0)

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

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

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

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

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
            tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }
}