我创建了一个名为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
答案 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;
}
}