【问题标题】:API11 (and now12) and Spannable causing runtime NPEAPI11(和 now12)和 Spannable 导致运行时 NPE
【发布时间】:2011-05-11 16:55:44
【问题描述】:

5 月 14 日更新

如果我替换了

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

只是换个颜色

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

然后它运行正常。

logcat 中对 TextLine,measure 的引用应该给了我一个线索。 不过我仍然想修复它,我相信其他人会要求在单个文本行中混合大小。

5 月 12 日更新 - 最小代码示例显示在本文末尾

在 SDK 2.everything 下运行良好的代码在 3.0 模拟器中运行时会引发空指针异常。我已将其范围缩小到我的代码中唯一出现的 SpannableString。我正在使用它在屏幕顶部的横幅区域中放置一些不同字体大小的文本。日志是:

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)

代码在由计时器调用的处理程序中,它使用以下基本行写入文本视图(省略空检查等)

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 的 RAM 来说并不容易),它会通过处理程序方法 OK,- spanRange 不为空,但 NPE 和 FC 稍后会在主循环器中发生。

文本视图 (RefTxt) 位于名为 infobar.xml 的 xml 中,该 xml 包含在 main.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>

如果我将 SpannableString 替换为普通的旧字符串,则应用程序将在 3.0 模拟器中运行。 我想知道我是否需要对 Spannables 和平板电脑设备采取任何额外措施?

当它死掉时,调试透视图显示 - mt 和 tl 都不为空

更新示例 我已将其简化为演示错误的最小代码示例,在 2.1 下没问题,但在 3.0 下使用相同的 NPE 崩溃

活动代码:

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 是一个 LinearLayout,只包含一个 TextView。我的包含 custompoint 的 styles.xml 是:

<?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>

.

【问题讨论】:

    标签: android


    【解决方案1】:

    您的 TextView 正在使用未设置 linkColor 的 TextPaint 对象。我看到您使用的样式/主题以某种方式未设置链接颜色。尝试将 linkColor 添加到样式中,看看是否能解决您的问题。

    编辑:您可能应该继承默认样式,这会给您想要的。不知道为什么行为从 2.1 更改为 3.0,但是...

    【讨论】:

    • 如何设置链接颜色?添加 #ff0000 会出现错误,并且在 linkColor 上的 Google 不会给我任何线索
    • 它终于接受了 #0000ff 然后我把 TextAppearanceSpan tas = new TextAppearanceSpan(ctx, R.style.custompoint); ColorStateList csl = tas.getLinkTextColor();在代码中。它捡起来没问题,但还是像以前一样死了。 (我希望 Google 能够在他们的命名约定中保持一些一致性!)
    • 试试&lt;item name="textColorLink"&gt;#ff0000&lt;/item&gt;
    • 我稍微分解了代码并添加了 TextAppearanceSpan tas = new TextAppearanceSpan(this,R.style.custompoint); MetricAffectingSpan mas = tas.getUnderlying();调试器显示 mas.mTypeface 为空。将样式中的字体设置为 sans,它出现在调试器中并运行正常。将其设置为正常,它再次显示为空但运行正常!?不明白!似乎该样式需要添加 textColor 和 typeface 才能在 API11 下运行。所以感谢您指出解决方案的一半(+1)
    • parent="@android:style/TextAppearance 为我工作,感谢您带领我朝这个方向前进。可惜它只是一个 3.2 错误
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多