2013-04-29 14 views
11

Sto cercando di implementare ViewHolder modello per migliorare la perfomance durante il disegno su tela sulla mappa. Ho bisogno di creare alcune etichette per i miei marcatori. Questo metodo viene chiamato durante l'elaborazione dei dati in draw()NullPointerException a TextView.checkForRelayout() mentre setText()

// now we create label view and convert it into bitmap 
private Bitmap createLabelBitmap(GisLaborHistoryObject object, HistoryPoint point) { 
    // create view from xml 
    if (vh == null) { 
     vh = new ViewHolder(); 
     vh.view = inflater.inflate(R.layout.map_gis_history_label, null, false); 
     vh.tv = (TextView) vh.view.findViewById(R.id.gislabeltext); 
    } 

    // set label content 
    if (vh.tv != null) { 
     if (!mSingleLaborHistory) { 
      String name = ""; 
      name = object.getDisplayName(); 
      if (name == null || "".equals(name)) 
       name = object.getPersonId(); 
      if (name == null || "".equals(name)) 
       name = object.getLaborCode(); 
      if (name == null) 
       name = ""; 

      vh.tv.setText(name); 
     } else 
      vh.tv.setText(point.getChangeDate()); 
    } 
    // measure resulting view 
    vh.view.measure(spec, spec); 
    vh.view.layout(0, 0, vh.view.getMeasuredWidth(), vh.view.getMeasuredHeight()); 
    Bitmap b = Bitmap.createBitmap(vh.view.getWidth(), vh.view.getHeight(), Bitmap.Config.ARGB_8888); 
    canvasToDraw.setBitmap(b); 
    canvasToDraw.translate(-vh.view.getScrollX(), -vh.view.getScrollY()); 
    vh.view.draw(canvasToDraw); 
    return b; 
} 

specifica è

spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 

il risultato è Logcat:

disposizione
04-29 17:12:34.057: E/AndroidRuntime(389): java.lang.NullPointerException 
04-29 17:12:34.057: E/AndroidRuntime(389):  at android.widget.TextView.checkForRelayout(TextView.java:5497) 
04-29 17:12:34.057: E/AndroidRuntime(389):  at android.widget.TextView.setText(TextView.java:2730) 
04-29 17:12:34.057: E/AndroidRuntime(389):  at android.widget.TextView.setText(TextView.java:2598) 
04-29 17:12:34.057: E/AndroidRuntime(389):  at android.widget.TextView.setText(TextView.java:2573) 
04-29 17:12:34.057: E/AndroidRuntime(389):  at com.xxx.android.proj.ui.map.overlays.LaborsMarkerOverlay.createLabelBitmap(LaborsMarkerOverlay.java:164) 

XML io uso

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/gislabeltext" 
style="@style/labelStyle" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:paddingLeft="2dp" 
android:paddingRight="2dp" /> 

quale può essere una ragione di questo errore?

+1

Si noti che si tratta di un bug di Android che sembra influenzare 4.4.3 Android e 4.4.4 dispositivi, ma è stato risolto di Android 5.1 - https://code.google.com/p/android/issues/detail?id = 75.877. –

risposta

16

Dopo aver cercato su Android source code alla riga 5497 ho notato che c'è un controllo utilizzando mLayoutParams. Ho guardato caso whis in modalità debug ed è stato davvero nullo! Aggiungo una riga che imposta in modo esplicito questi parametri. Ora tutto funziona bene.

vh.tv = (TextView) vh.view.findViewById(R.id.gislabeltext); 
vh.tv.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

Il mio errore è stato che ho dovuto impostare LayoutParams in modo esplicito quando si gonfia con ViewGroup root = null; Tutto funziona bene fino a quando non cerco di riutilizzare TextView moltiplicando le volte.

1

devi chiamare il metodo vh.tv.setText all'interno del tuo thread ui. Quindi assicurati di farlo.

+0

Questo esempio funziona nel metodo 'Disegna (tela di canapa, MapView mapView, boolean shadow)'. –

Problemi correlati