0

當我在佈局中使用自定義窗口小部件類型時,出現空指針異常。我在我的src文件中也有這個小部件,但無法找到爲什麼會出現此異常。在android layout.xml文件中編譯時的空指針異常

它給在編譯時以下錯誤com.siliconithub.android.zoom.ImageZoomView

顯示java.lang.NullPointerException

異常詳細信息記錄在窗口>顯示視圖>錯誤日誌

這是我的item_image_detail.xml文件。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="320dp" 
    android:layout_height="fill_parent" 
    android:background="#FFF" 
    android:minWidth="320dp" 
    android:orientation="vertical" > 

<LinearLayout 
    android:id="@+id/frameImage" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginLeft="3dp" 
    android:layout_marginRight="3dp" 
    android:background="#000" 
    android:gravity="center_horizontal" > 

    <com.siliconithub.android.zoom.ImageZoomView 
     android:id="@+id/imgWithZoom" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
</LinearLayout> 

<TableRow 
    android:id="@+id/rowOptionsImage" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="3dp" 
    android:layout_marginRight="3dp" 
    android:background="@drawable/bg_bottom" 
    android:gravity="center" > 

    <TextView 
     android:id="@+id/totalLikes" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingRight="10dp" 
     android:textColor="#FFF" /> 

    <ImageButton 
     android:id="@+id/btnLike" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@android:color/transparent" 
     android:contentDescription="@string/description_btnlike" 
     android:src="@drawable/btn_like" /> 

    <TextView 
     android:id="@+id/totalComments" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:drawableLeft="@drawable/ic_comment" 
     android:gravity="center_vertical" 
     android:paddingLeft="50dp" 
     android:textColor="#FFF" /> 
</TableRow> 

可能是什麼原因?

編輯:

這裏是它的一個logcat的:

ImageZoomView的
java.lang.NullPointerException 
at com.siliconithub.android.zoom.ImageZoomView.onLayout(ImageZoomView.java:166) 
at android.view.View.layout(View.java:11278) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628) 
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1617) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1401) 
at android.view.View.layout(View.java:11278) 
at android.view.ViewGroup.layout(ViewGroup.java:4224) 
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925) 
at android.view.View.layout(View.java:11278) 
at android.view.ViewGroup.layout(ViewGroup.java:4224) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
at android.view.View.layout(View.java:11278) 
at android.view.ViewGroup.layout(ViewGroup.java:4224) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399) 
at android.view.View.layout(View.java:11278) 
at android.view.ViewGroup.layout(ViewGroup.java:4224) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399) 
at android.view.View.layout(View.java:11278) 
at android.view.ViewGroup.layout(ViewGroup.java:4224) 
at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:449) 
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:326) 
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:325) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:372) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1638) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1389) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:1163) 
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.delegatePageChange(LayoutEditorDelegate.java:674) 
at com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor.pageChange(CommonXmlEditor.java:360) 
at org.eclipse.ui.part.MultiPageEditorPart$2.widgetSelected(MultiPageEditorPart.java:290) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) 
at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2746) 
at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1433) 
at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) 
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1410) 

代碼:

public class ImageZoomView extends View implements Observer { 

    /** Paint object used when drawing bitmap. */ 
    private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG); 

    /** Rectangle used (and re-used) for cropping source image. */ 
    private final Rect mRectSrc = new Rect(); 

    /** Rectangle used (and re-used) for specifying drawing area on canvas. */ 
    private final Rect mRectDst = new Rect(); 

    /** Object holding aspect quotient */ 
    private final AspectQuotient mAspectQuotient = new AspectQuotient(); 

    /** The bitmap that we're zooming in, and drawing on the screen. */ 
    private Bitmap mBitmap; 

    /** State of the zoom. */ 
    private ZoomState mState; 

    // Public methods 

    /** 
    * Constructor 
    */ 
    public ImageZoomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    /** 
    * Set image bitmap 
    * 
    * @param bitmap The bitmap to view and zoom into 
    */ 
    public void setImage(Bitmap bitmap) { 
     mBitmap = bitmap; 

     mAspectQuotient.updateAspectQuotient(getWidth(), getHeight(), mBitmap.getWidth(), mBitmap 
      .getHeight()); 
     mAspectQuotient.notifyObservers(); 

     invalidate(); 
    } 

    /** 
    * Set object holding the zoom state that should be used 
    * 
    * @param state The zoom state 
    */ 
    public void setZoomState(ZoomState state) { 
     if (mState != null) { 
      mState.deleteObserver(this); 
     } 

     mState = state; 
     mState.addObserver(this); 

     invalidate(); 
    } 

    /** 
    * Gets reference to object holding aspect quotient 
    * 
    * @return Object holding aspect quotient 
    */ 
    public AspectQuotient getAspectQuotient() { 
     return mAspectQuotient; 
    } 

    // Superclass overrides 

    @Override 
    protected void onDraw(Canvas canvas) { 
     if (mBitmap != null && mState != null) { 
      final float aspectQuotient = mAspectQuotient.get(); 

      final int viewWidth = getWidth(); 
      final int viewHeight = getHeight(); 
      final int bitmapWidth = mBitmap.getWidth(); 
      final int bitmapHeight = mBitmap.getHeight(); 

      final float panX = mState.getPanX(); 
      final float panY = mState.getPanY(); 
      final float zoomX = mState.getZoomX(aspectQuotient) * viewWidth/bitmapWidth; 
      final float zoomY = mState.getZoomY(aspectQuotient) * viewHeight/bitmapHeight; 

      // Setup source and destination rectangles 
      mRectSrc.left = (int)(panX * bitmapWidth - viewWidth/(zoomX * 2)); 
      mRectSrc.top = (int)(panY * bitmapHeight - viewHeight/(zoomY * 2)); 
      mRectSrc.right = (int)(mRectSrc.left + viewWidth/zoomX); 
      mRectSrc.bottom = (int)(mRectSrc.top + viewHeight/zoomY); 
      mRectDst.left = getLeft(); 
      mRectDst.top = getTop(); 
      mRectDst.right = getRight(); 
      mRectDst.bottom = getBottom(); 

      // Adjust source rectangle so that it fits within the source image. 
      if (mRectSrc.left < 0) { 
       mRectDst.left += -mRectSrc.left * zoomX; 
       mRectSrc.left = 0; 
      } 
      if (mRectSrc.right > bitmapWidth) { 
       mRectDst.right -= (mRectSrc.right - bitmapWidth) * zoomX; 
       mRectSrc.right = bitmapWidth; 
      } 
      if (mRectSrc.top < 0) { 
       mRectDst.top += -mRectSrc.top * zoomY; 
       mRectSrc.top = 0; 
      } 
      if (mRectSrc.bottom > bitmapHeight) { 
       mRectDst.bottom -= (mRectSrc.bottom - bitmapHeight) * zoomY; 
       mRectSrc.bottom = bitmapHeight; 
      } 

      canvas.drawBitmap(mBitmap, mRectSrc, mRectDst, mPaint); 
     } 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom)  { 
     super.onLayout(changed, left, top, right, bottom); 

     mAspectQuotient.updateAspectQuotient(right - left, bottom - top, mBitmap.getWidth(), 
       mBitmap.getHeight()); 
     mAspectQuotient.notifyObservers(); 
    } 

    // implements Observer 
    public void update(Observable observable, Object data) { 
     invalidate(); 
    } 
} 
+2

發佈您的logcat。 –

+0

我用logcat更新了我的答案。看我的編輯部分。 –

+0

我將從ImageZoomView.java中的第166行開始。 'java.lang.NullPointerException at com.siliconithub.android.zoom.ImageZoomView.onLayout(ImageZoomView.java:166)' – Sam

回答

0

你缺少的構造函數:

/** 
* Constructors 
*/ 


public ImageZoomView(Context context) { 
    this(context, null); 
} 

public ImageZoomView(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public ImageZoomView(Context context, AttributeSet attrs, int defaultStyles) { 
    super(context, attrs, defaultSytles); 
}