2012-06-25 86 views
-1

第一抱歉,我的英語,我是西班牙語,現在,我有問題製作一個自定義類,擴展視圖。 Theese是我的課,我的xml文件:NullPointerException與自定義查看


public class Pintar extends View { 
    private Bitmap mBitmap = null; 
    private Canvas mCanvas = null; 
    private Path mPath = null; 
    private float mX, mY; 
    private static final float TOLERANCE = 4; 
    private LinearLayout pizarra; 

    public Pintar(Context context) { 
     super(context); 
     // obtener pantalla 
     pizarra= (LinearLayout) findViewById (R.id.pizarra); 
     mBitmap = Bitmap.createBitmap(pizarra.getWidth(), 
       pizarra.getHeight(), Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
     mPath = new Path(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touchStart(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touchMove(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touchUp(); 
      invalidate(); 
      break; 
     } 
     return true; 
    } 

    private void touchStart(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 

    private void touchMove(float x, float y) { 
     if (Math.abs(x - mX) >= TOLERANCE || Math.abs(y - mY) >= TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 

    private void touchUp() { 
     mPath.lineTo(mX, mY); 
     mCanvas.drawPath(mPath, Blackboard.mPaint); 
     mPath.reset(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // fondo 
     canvas.drawColor(0XFFBBBBBB); 
     // lo ya pintado 
     canvas.drawBitmap(mBitmap, 0, 0, null); 
     // el trazo actual 
     canvas.drawPath(mPath, Blackboard.mPaint); 
    } 



public class Blackboard extends Activity { 

    public static Paint mPaint = null; 
    protected Pintar board; 
    private LinearLayout pizarra; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     board = new Pintar(this); 
     pizarra= (LinearLayout) findViewById (R.id.pizarra); 
     pizarra.addView(board); 
     setContentView(R.layout.main); 
     // preparamos el pincel 
     mPaint = new Paint(); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0XFF00E1FF); 
     mPaint.setStrokeWidth(10); 
    } 

我想在頂部的LinearLayout的ImageButton的,並在底部的LinearLayout,我想用我的自定義類作畫以示但我有這個錯誤:

06-25 18:43:07.578: E/AndroidRuntime(19822): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.acme.blackboard/com.acme.blackboard.Blackboard}: java.lang.NullPointerException 

感謝您的答案

+0

請在這裏添加相關的java代碼。 – Sajmon

+0

您可以將代碼發佈在Blackboard構造函數中嗎?它可能與您的佈局無關 – Charleh

+1

您可以發佈堆棧跟蹤的其餘部分嗎? – theelfismike

回答

0

您的自定義視圖Pintar從未放任何內容,所以找不到findViewById會一直返回null。一個簡單的方法來解決這個問題是從FrameLayout(或其他ViewGroup)推導來代替:

public class Pintar extends FrameLayout { 

public Pintar(Context context) { 
    super(context); 

    final LayoutInflater layoutInflater = LayoutInflater.from(context); 
    layoutInflater.inflate(R.layout.whatever_your_layout_id_is, this, true); 

    pizarra= (LinearLayout) findViewById (R.id.pizarra); // << now this will have something to find 
    ... 
+0

修好了,非常感謝 –

0

setContentView呼叫移動findViewbyId代碼行..

public class Blackboard extends Activity { 
... 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    board = new Pintar(this); 
    pizarra= (LinearLayout) findViewById (R.id.pizarra); 
    pizarra.addView(board); 

    // preparamos el pincel 
    mPaint = new Paint(); 
    mPaint.setStyle(Paint.Style.STROKE); 
    .... 
    .... 
} 
0

您需要包括您的自定義查看你的HTML訪問之前:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:background="@android:color/white" > 

     <ImageButton 
      android:id="@+id/paleta" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/paleta" /> 
    </LinearLayout> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/pizarra" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

     <com.yourpackage.Pintar android:id="@+id/pintar" ... /> 

    </LinearLayout> 

</LinearLayout> 
在你的代碼

那麼你可以簡單findViewById而不是創建一個新的實例:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    board = (Pintar)this.findViewById(R.id.pintar); 
    pizarra= (LinearLayout) findViewById (R.id.pizarra); 

    ... 
}