3

我创建了一个名为 .xml 的 XML 布局def_list。我已经为它分配了一个 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
4

9 回答 9

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 的对象

编辑 :

请检查以下自定义 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);
    }
  }
}

我在我以前的一个项目中使用过这个类

于 2013-12-26T14:15:28.843 回答
0

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

但是有一个问题。文本视图似乎仍然没有应用提到的字体。它只是使用默认字体。我有一个列表视图的 XML 布局,我想使用我分配的字体。它将字符串添加到 ArrayList 并且列表视图的适配器使用如下代码:

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

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

于 2013-12-27T12:27:28.157 回答
0

你应该注意"fonts/bn.ttf"。所有的词都必须在原型中。
bn.ttfBN.TTF。所以请注意assets文件夹并确保来自原型名称。

于 2014-01-20T21:04:42.680 回答
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。我遇到了与您在犯此错误时遇到的相同错误。我希望这对您有所帮助。

于 2014-08-28T11:26:00.947 回答
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);
于 2014-09-09T11:32:27.077 回答
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;
    }
}
于 2014-12-09T06:37:02.740 回答
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,您可以使用以下代码:

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

谢谢

于 2014-07-11T06:18:57.073 回答
0

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

于 2013-12-26T13:52:45.357 回答
0

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

于 2013-12-26T16:49:53.520 回答