2014-10-19 76 views
0

我嘗試了一切可以找到自定義字體的工作,但我不斷收到'空指針異常。以下是我所做的:自定義字體空指針異常

  1. 在'資產'目錄中創建文件夾'字體'。

  2. 下載谷歌的 '的Roboto' 從這裏字體:http://www.fontspace.com/google-android/roboto

  3. 重命名的文件 '的Roboto-Regular.ttf' 到 'r.ttf'

  4. 上傳到資產/ fonts /目錄中

  5. 做項目 - >清潔

現在我有這樣的代碼:

  try { 
       fileList = am.list("fonts"); 

       if (fileList != null) 
       { 
        for (int i = 0;i<fileList.length;i++) 
        { 
         Toast.makeText(getApplicationContext(), fileList[i] + "!", Toast.LENGTH_LONG).show(); 
        } 
       } 
      } catch (IOException e) { 
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); 
      } 


     try { 

     Typeface font = Typeface.createFromAsset(getAssets(), "fonts/r.ttf"); 

     TextView txt = (TextView) findViewById(R.id.rowTextView); 
     txt.setTypeface(font); 
     } 
     catch(Exception e) 
     { 
      Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); 
     } 

代碼的第一部分列出'字體'文件夾中的所有項目,我得到一個彈出窗口顯示'r.ttf'。

代碼的第二部分嘗試加載字體,我從那裏用'空指針異常'得到一個彈出窗口。

任何想法我做錯了什麼?謝謝!

編輯: 該異常是在由該拋出: 顯示java.lang.NullPointerException上txt.setTypeface(字體);

EDIT2:

這是我activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#000000" 

android:paddingBottom="@dimen/activity_vertical_margin" 

android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.kb.klog.MainActivity" > 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

</ListView> 

</RelativeLayout> 

這是我想要的字體更改到行:/res/layout/row.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rowTextView" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:padding="5dp" 
android:textColor="#aaa" 
android:textSize="18sp"> 

+0

您確定您有該ID,並且在您嘗試訪問它的位置時它已經膨脹了嗎? – helleye 2014-10-19 13:52:13

+0

我有這個ID,我可以按住ctrl + click_on_id,它將我帶到xml文件。不確定你在'嘗試訪問它時已經膨脹了'的意思,我在'onCreate'事件中有這個代碼 – user3578847 2014-10-19 13:55:37

+0

你有** setContentView **正確的xml嗎? – helleye 2014-10-19 13:58:53

回答

3

TXT值爲null,因爲該行沒有被當時充氣字體。 我會建議使用這個答案https://stackoverflow.com/a/9035924/2160877
一般來說,你應該創建自己的擴展TextView的類。然後你在xml中引用那個類,這就是全部。

如果該鏈接被刪除,這裏是你的類的代碼(如從鏈接採取了一些修改您的情況):

package com.yourPackageNameGoesHere; 

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.AttributeSet; 
import android.widget.TextView; 

public class MyTextView extends TextView { 

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

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

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

    private void init() { 
     Typeface tf = Typeface.createFromAsset(getContext().getAssets(), 
               "r.ttf"); 
     setTypeface(tf); 
    } 

} 

然後你/ RES /佈局/行。xml將如下所示:

<com.yourPackageNameGoesHere.MyTextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rowTextView" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:padding="5dp" 
android:textColor="#aaa" 
android:textSize="18sp"> 
+0

非常感謝您的回答。我遇到了一個Eclipse錯誤:XML文檔結構必須在同一個實體中開始和結束。我將名稱更改爲我的項目。 – user3578847 2014-10-19 14:30:24

+0

nvm我愚蠢的初學者錯誤。它工作完美,謝謝sooooo多! – user3578847 2014-10-19 14:37:50

0

如果您需要自定義字體只需使用此代碼

確保你把後,你在assets/fonts

 Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf"); 
     TextView myTextView = (TextView)findViewById(R.id.myTextView); 
     myTextView.setTypeface(myTypeface); 
+0

我的代碼完全一樣的東西,我得到這一行的異常:myTextView.setTypeface(myTypeface); – user3578847 2014-10-19 13:49:57

+0

您是否嘗試清潔並構建您的項目 – 2014-10-19 13:51:51

+0

如果您更新錯誤堆棧的問題 – 2014-10-19 13:52:19