title: No such method exists
body: <p>I've been playing around with code I found at <a href="http://www.droidnova.com/playing-with-graphics-in-android-part-ii,160.html" rel="nofollow noreferrer">Android Development - Playing with graphics in Android</a>.</p>
  <p>Unfortunately, I haven't been so lucky with my implementaion of the code lol I believe, based upon <em>LogCat</em>, that Android is unable to find a method which does exist.</p>
  <p>Below are the logcat details:</p>
  <p><em><strong>Logcat</strong></em></p>
  <pre><code> 02-08 12:43:07.725: E/AndroidRuntime(9284): FATAL EXCEPTION: main
      02-08 12:43:07.725: E/AndroidRuntime(9284): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.odhranlynch.interiordesigner/com.odhranlynch.interiordesigner.NewProduct}: android.view.InflateException: Binary XML file line #6: Error inflating class com.odhranlynch.interiordesigner.NewProduct$designCanvas
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.os.Handler.dispatchMessage(Handler.java:99)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.os.Looper.loop(Looper.java:123)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.ActivityThread.main(ActivityThread.java:3691)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at java.lang.reflect.Method.invokeNative(Native Method)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at java.lang.reflect.Method.invoke(Method.java:507)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at dalvik.system.NativeStart.main(Native Method)
      02-08 12:43:07.725: E/AndroidRuntime(9284): Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class com.odhranlynch.interiordesigner.NewProduct$designCanvas
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.view.LayoutInflater.createView(LayoutInflater.java:508)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.Activity.setContentView(Activity.java:1663)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at com.odhranlynch.interiordesigner.NewProduct.onCreate(NewProduct.java:28)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
      02-08 12:43:07.725: E/AndroidRuntime(9284):     ... 11 more
      02-08 12:43:07.725: E/AndroidRuntime(9284): Caused by: java.lang.NoSuchMethodException: designCanvas(Context,AttributeSet)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at java.lang.Class.getMatchingConstructor(Class.java:643)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at java.lang.Class.getConstructor(Class.java:472)
      02-08 12:43:07.725: E/AndroidRuntime(9284): at android.view.LayoutInflater.createView(LayoutInflater.java:480)
  02-08 12:43:07.725: E/AndroidRuntime(9284):     ... 21 more
  </code></pre>
  <p><em><strong>NewProduct.java</strong></em></p>
  <pre><code>public class NewProduct extends Activity {
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      requestWindowFeature(Window.FEATURE_NO_TITLE);
      setContentView(R.layout.new_product);
  }
  
  class designCanvas extends SurfaceView implements SurfaceHolder.Callback {
      private drawThread _thread;
      private ArrayList&lt;GraphicObject&gt; _graphics = new ArrayList&lt;GraphicObject&gt;();
  
      public designCanvas(Context context, AttributeSet attrs) {
          super(context, attrs);
          getHolder().addCallback(this);
          _thread = new drawThread(getHolder(), this); 
          setFocusable(true);
      }
      
      @Override
      public boolean onTouchEvent(MotionEvent event) {
          synchronized (_thread.getSurfaceHolder()) {
              if (event.getAction() == MotionEvent.ACTION_UP) {
                  GraphicObject graphic = new GraphicObject(BitmapFactory.decodeResource(getResources(), R.drawable.circle_point));
                  graphic.getCoordinates().setX((int) event.getX() - graphic.getGraphic().getWidth() / 2);
                  graphic.getCoordinates().setY((int) event.getY() - graphic.getGraphic().getHeight() / 2);
                  _graphics.add(graphic);
              }
              return true;
          }
      }
      
      @Override 
      public void onDraw(Canvas canvas) {
          //Set canvas background size and colour
          Path mPath = new Path();
          Paint paint = new Paint(); 
          canvas.drawColor(Color.DKGRAY);
          Bitmap b = Bitmap.createBitmap(200, 200,
          Bitmap.Config.ARGB_8888);
          
  
          paint.setFilterBitmap(true);
          Bitmap productImage = BitmapFactory.decodeResource(getResources(),R.drawable.glass_lamp);
          canvas.drawBitmap(productImage, 0, 0, paint);
  
          Canvas c = new Canvas(b);
          paint.setAlpha(255); //0x80
          c.translate(0, 30);
          //c.drawBitmap(productImage, new Matrix(), paint);
          paint.setColor(Color.BLUE);
          
          Bitmap bitmap;
          GraphicObject.Coordinates coords;
          for (GraphicObject graphic : _graphics) {
              //Create a graphical point indicating where the user has touched on screen.
              bitmap = graphic.getGraphic();
              coords = graphic.getCoordinates();
              canvas.drawBitmap(bitmap, coords.getX(), coords.getY(), null);
              //Create path coords points are being placed on canvas.
              Log.d(&quot;Point Cords&quot;, String.valueOf(coords.getX() + &quot; &quot; + coords.getY()));
              
              if (_graphics.isEmpty()) {
                  //_graphics array has no entries, so this is the first coord.
                  mPath.moveTo(coords.getX(), coords.getY());
              } else {
                  //Record subsequent coords.
                  mPath.lineTo(coords.getX(), coords.getY());
              }
          }
      }
      
      //@Override
       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
          //TODO something
      }
      
      //@Override
      public void surfaceCreated(SurfaceHolder holder) {
          _thread.setRunning(true);
          _thread.start();
      }
   
      //@Override
      public void surfaceDestroyed(SurfaceHolder holder) {
          // simply copied from sample application LunarLander:
          // we have to tell thread to shut down &amp; wait for it to finish, or else
          // it might touch the Surface after we return and explode
          boolean retry = true;
          _thread.setRunning(false);
          while (retry) {
              try {
                  _thread.join();
                  retry = false;
              } catch (InterruptedException e) {
                  // we will try it again and again...
              }
          } 
      }
  }
  
  class drawThread extends Thread {
      private SurfaceHolder _surfaceHolder;
      private designCanvas _panel;
      private boolean _run = false;
          
      public drawThread(SurfaceHolder surfaceHolder, designCanvas panel) {
          _surfaceHolder = surfaceHolder;
          _panel = panel;
      }
          
      public void setRunning(boolean run) {
          _run = run;
      }
          
      public SurfaceHolder getSurfaceHolder() {
          return _surfaceHolder;
      }
          
      public void run() {
          Canvas c;
          while (_run) {
              c = null;
              try {
                  c = _surfaceHolder.lockCanvas(null);
                  synchronized (_surfaceHolder) { 
                      _panel.onDraw(c);
                  }
              } finally {
                  // do this in a finally so that if an exception is thrown
                  // during the above, we don't leave the Surface in an
                  // inconsistent state
                  if (c != null) {
                      _surfaceHolder.unlockCanvasAndPost(c);
                  }
              }
          }
      }
  }
  
  class GraphicObject {
      /**
       * Contains the coordinates of the graphic.
       */
      public class Coordinates {
          private int _x = 100;
          private int _y = 0;
   
          public int getX() {
              return _x + _bitmap.getWidth() / 2;
          }
   
          public void setX(int value) {
              _x = value - _bitmap.getWidth() / 2;
          }
   
          public int getY() {
              return _y + _bitmap.getHeight() / 2;
          }
   
          public void setY(int value) {
              _y = value - _bitmap.getHeight() / 2;
          }
   
          public String toString() {
              return &quot;Coordinates: (&quot; + _x + &quot;/&quot; + _y + &quot;)&quot;;
          }
      }
      
      private Bitmap _bitmap;
      private Coordinates _coordinates;
  
      public GraphicObject(Bitmap bitmap) {
          _bitmap = bitmap;
          _coordinates = new Coordinates();
      }
  
      public Bitmap getGraphic() {
          return _bitmap;
      }
  
      public Coordinates getCoordinates() {
          return _coordinates;
      }
  }
  </code></pre>
  <p>and finally, the <strong>new_product.xml</strong></p>
  <pre><code>&lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  android:layout_width=&quot;wrap_content&quot;
  android:layout_height=&quot;fill_parent&quot; &gt;
  
  &lt;view class=&quot;com.odhranlynch.interiordesigner.NewProduct$designCanvas&quot;
      android:id=&quot;@+id/surfaceView&quot;
      android:layout_width=&quot;fill_parent&quot;
      android:layout_height=&quot;fill_parent&quot;
      android:layout_alignParentTop=&quot;true&quot; /&gt;
  
               ... Code snipped ...
  
  &lt;/RelativeLayout&gt;
  </code></pre>
  <p>Sorry for the amount of code above, it just I'm curious as to where I'm wrong.
  Many thanks in advance :)</p>