2013-04-29 40 views
11

Tôi đang cố triển khai mẫu ViewHolder để cải thiện hiệu suất khi vẽ trên canvas trên bản đồ. Tôi cần tạo một số nhãn cho các điểm đánh dấu của mình. Phương pháp này được gọi là thời gian xử lý dữ liệu trong draw()NullPointerException tại TextView.checkForRelayout() trong khi 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; 
} 

spec là

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

kết quả được Logcat:

bố trí
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 tôi sử dụng

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

điều gì có thể là lý do của lỗi này?

+1

Lưu ý rằng đây là lỗi Android dường như ảnh hưởng đến thiết bị Android 4.4.3 và 4.4.4 nhưng được khắc phục trong Android 5.1 - https://code.google.com/p/android/issues/detail?id = 75877. –

Trả lời

16

Sau khi nhìn vào android source code tại dòng 5497 Tôi nhận thấy rằng có một kiểm tra bằng cách sử dụng mLayoutParams. Tôi đã nhìn trường hợp whisky trong chế độ gỡ lỗi và nó thực sự là null! Tôi thêm dòng đặt rõ ràng thông số này. Bây giờ mọi thứ hoạt động tốt.

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

Lỗi của tôi là tôi phải đặt LayoutParams rõ ràng khi lạm dụng với ViewGroup root = null; Mọi thứ hoạt động tốt cho đến khi tôi cố gắng tái sử dụng TextView nhân với số lần.

1

bạn cần gọi phương thức vh.tv.setText trong chuỗi ui của bạn. Vì vậy, hãy chắc chắn rằng bạn đang làm điều đó.

+0

Mẫu này hoạt động trong phương thức 'vẽ (Canvas canvas, MapView mapView, boolean shadow) của Overlay'. –

Các vấn đề liên quan