2011-05-11 25 views
5

更新5月14日API11(和now12)和Spannable導致運行NPE

它的文本大小,打破它的搭配,如果我只是一個喜歡的顏色的變化更換

<item name = "android:textSize">16sp</item> 

<item name="android:textColor">#00ff00</item> 

然後它運行正常。

引用TextLine,在logcat中測量應該給了我一個線索。 雖然我仍然想要修復它,但我相信其他人會對單個文本行中的大小混合進行要求。

Udpdated 5月12日 - 最少的代碼示例被示出在該交

代碼這下SDK 2.everything正常工作的端部,在一個3.0模擬器中運行時引發一個空指針異常。我已經縮小到我的代碼中唯一出現的SpannableString。我正在使用它在屏幕頂部的橫幅區域放置不同字體大小的文本。的logcat的是:

FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at android.text.style.TextAppearanceSpan.updateDrawState(TextAppearanceSpan.java:209) 
    at android.text.TextLine.handleRun(TextLine.java:848) 
    at android.text.TextLine.measureRun(TextLine.java:399) 
    at android.text.TextLine.measure(TextLine.java:278) 
    at android.text.TextLine.metrics(TextLine.java:252) 
    at android.text.Layout.measurePara(Layout.java:1432) 
    at android.text.Layout.getDesiredWidth(Layout.java:89) 
    at android.text.Layout.getDesiredWidth(Layout.java:68) 
    at android.widget.TextView.onMeasure(TextView.java:5713) 
    at android.view.View.measure(View.java:10577) 
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581) 
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 
    at android.view.View.measure(View.java:10577) 
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581) 
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 
    at android.view.View.measure(View.java:10577) 
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581) 
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 
    at android.view.View.measure(View.java:10577) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4270) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
    at android.view.View.measure(View.java:10577) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:764) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:519) 
    at android.view.View.measure(View.java:10577) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4270) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:1876) 
    at android.view.View.measure(View.java:10577) 
    at android.view.ViewRoot.performTraversals(ViewRoot.java:885) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1944) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:126) 
    at android.app.ActivityThread.main(ActivityThread.java:3997) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:491) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 

的代碼是一個由計時器稱爲處理程序,將其寫入與以下基本行的文本視圖(null檢查等中省略)

TextView tvBanner = (TextView) findViewById(R.id.RefText); 
..... 
int startSpan = altDispStr.indexOf("\n"); 
int endSpan = altDispStr.length(); 
spanRange = new SpannableString(altDispStr); 
spanRange.setSpan(new TextAppearanceSpan(this, 
    R.style.custompoint), startSpan, endSpan, 
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

.... 
.... 
tvBanner.setText(spanRange); 

當我陷阱它在調試器中(使用3.0模擬器和3GB內存不容易),它會通過處理程序方法確定, - spanRange不爲空,但NPE和FC稍後會在主循環中發生。

textview(RefTxt)位於main.xml中包含的名爲infobar.xml的xml中。信息欄的基本組成部分是:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/BannerRelView" 
android:layout_alignParentTop="true" 
android:layout_height="wrap_content" 
android:layout_centerHorizontal="true" 
android:background="#800000ff" 
android:layout_width="wrap_content"> 
    <TextView 
     android:id="@+id/BannerOptionsButton"  
     android:layout_alignParentRight="true" 
     ....  
    </TextView> 
    <TextView 
     android:id="@+id/BannerGPS" 
     android:layout_toLeftOf="@+id/BannerOptionsButton"  
     .... 
     </TextView> 
     <TextView 
     android:id="@+id/RefText" 
     android:layout_toLeftOf="@+id/BannerGPS" 
     ...... 
     </TextView> 
</RelativeLayout> 

如果我更換一個普通的舊的字符串,然後在3.0的模擬器的應用程序運行的SpannableString。 我想知道是否有任何額外的措施,我需要採取Spannables和平板設備?

當它死,調試透視圖顯示 crash state - MT和TL都是不爲空

更新例如 我已經減少這這表明了錯誤最小的代碼示例,它是在確定2.1但具有相同NPE崩潰下3.0

活動碼:

public class SpanTest extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     String dispStr = "I'm the first line\nI'm the second line"; 
     TextView tvBanner = (TextView) findViewById(R.id.textView1); 
     int startSpan = dispStr.indexOf("\n"); 
     int endSpan = dispStr.length(); 
     Spannable spanRange = new SpannableString(dispStr); 
     spanRange.setSpan(new TextAppearanceSpan(this, R.style.custompoint), startSpan, endSpan, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     tvBanner.setText(spanRange); 
    } 
} 

main.xml是僅包含一個TextView的LinearLayout。我的styles.xml包含custompoint是:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style 
     name="custompoint"> 
     <item name="android:textSize">24sp</item> 
     <item name="android:textStyle">bold</item> 
    </style> 
</resources> 

回答

7

您的TextView正在使用沒有linkColor集的TextPaint對象。我看到你使用的風格/主題不知怎麼設置linkColor。嘗試添加一個linkColor風格,看看是否可以解決你的問題。

編輯:你應該可能會繼承默認樣式,那會給你你想要的。不知道爲什麼行爲從2.1更改爲3.0,但...

+0

如何設置linkColor?添加#ff0000給出了一個錯誤,並在谷歌上linkColor不給我一個線索 – NickT 2011-05-13 21:36:41

+0

它終於接受#0000ff然後我把TextAppearanceSpan tas = new TextAppearanceSpan(ctx,R.style.custompoint); \t \t ColorStateList csl = tas.getLinkTextColor();在代碼中。它撿起來確定但仍然像以前一樣死去。 (我希望谷歌能在他們的命名約定中保持一致性!) – NickT 2011-05-13 22:10:42

+0

嘗試'#ff0000'。 – Femi 2011-05-13 22:25:48

相關問題