API11 (y ahora12) y Spannable causando NPE de tiempo de ejecución

Actualización 14 de mayo

Es la mezcla de tamaños de texto que lo rompe, si reemplazo el

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

Con sólo un cambio de color como

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

Entonces funciona bien.

Las referencias a TextLine, medida en el logcat deberían haberme dado una pista. Todavía me gustaría arreglarlo, sin embargo, estoy seguro de que otros tendrán un requisito para una mezcla de tamaños en una sola línea de texto.

Udpdated 12 May – ejemplo de código mínimo se muestra al final de esta publicación

Código que funciona bien en SDK 2.everything, lanza una excepción de puntero nulo cuando se ejecuta en un emulador 3.0. Lo he reducido a la única aparición de una SpannableString en mi código. Estoy usando esto para poner un texto de diferentes tamaños de fuente en un área de banner en la parte superior de la pantalla. El logcat es:

 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) 

El código está en un controlador llamado por un temporizador, escribe en una vista de texto con las siguientes líneas esenciales (se omite el cheque nulo, etc.)

 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); 

Cuando lo atrapa en el depurador (no es fácil con el emulador 3.0 y 3GB de RAM) se obtiene a través del método handler OK, – spanRange no es nulo, pero el NPE y FC sucede algún tiempo más tarde en el looper principal.

El textview (RefTxt) está en un xml llamado infobar.xml que se incluye en el main.xml. Los componentes esenciales del infobar son:

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

Si reemplazo el SpannableString con una cadena vieja llana entonces la aplicación funciona en los emuladores 3.0. Me pregunto si hay alguna medida adicional que necesito tomar con Spannables y tablets?

Cuando muere, la perspectiva de depuración muestra Estado de choque – mt y tl no son nulos

Ejemplo de actualización He reducido esto al ejemplo de código más pequeño que demuestra el error, está bien en 2.1 pero se bloquea con el mismo NPE en 3.0

Código de actividad:

 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 es un LinearLayout que contiene sólo el TextView. Mi styles.xml que contiene custompoint es:

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

.

Su TextView está utilizando un objeto TextPaint que no tiene el conjunto linkColor . Veo que el estilo / tema que está utilizando es de alguna manera no establecer el linkColor. Trate de añadir un linkColor al estilo y ver si eso soluciona su problema.

EDIT: probablemente debería heredar el estilo predeterminado, y eso le dará lo que desea. No estoy seguro de por qué el comportamiento cambió de 2,1 a 3,0, pero …

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.