2012-02-08 1 views
1

Я играл с кодом, который я нашел по адресу Android Development - Playing with graphics in Android.Нет такого метода

К сожалению, мне не повезло с моей реализацией кода LOL, на который я полагаю, основываясь на LogCat, что Android не может найти способ, который существует.

Ниже приведены подробные сведения LogCat:

LogCat

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 

NewProduct.java

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<GraphicObject> _graphics = new ArrayList<GraphicObject>(); 

    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("Point Cords", String.valueOf(coords.getX() + " " + 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 & 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 "Coordinates: (" + _x + "/" + _y + ")"; 
     } 
    } 

    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; 
    } 
} 

и, наконец, new_product.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="fill_parent" > 

<view class="com.odhranlynch.interiordesigner.NewProduct$designCanvas" 
    android:id="@+id/surfaceView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentTop="true" /> 

      ... Code snipped ... 

</RelativeLayout> 

Извините за объем кода выше, это просто я интересно, где я ошибаюсь. Большое спасибо заранее :)

+1

duplicate http://stackoverflow.com/questions/4483433/error-inflating-inner-class-view –

+0

Вы указали активность в вашем manifest.xml? – THelper

+0

Здравствуйте, извините, что уделили время, чтобы ответить. @THelper, да, активность указана в файле manifest.xml. – Odhran

ответ

1

Здесь есть полезная запись Error inflating inner class view конечно

и последняя вещь, которая помогла было изменить в макет XML <view class=<View class= для , потому что макет XMLs являются case sensitive.

отрывок из здесь

http://developer.android.com/guide/topics/ui/declaring-layout.html

В общем, XML словарь для объявления элементов пользовательского интерфейса внимательно следит за структурой и именование классов и методов, где имена элементов соответствуют именам классов и атрибутов соответствуют методам. Фактически, соответствие часто настолько прямое, что вы можете догадаться, какой атрибут XML соответствует методу класса, или угадать, какой класс соответствует данному элементу xml. Однако обратите внимание, что не все словарные базы идентичны. В некоторых случаях существуют небольшие различия в именах. Например, элемент EditText имеет текстовый атрибут, который соответствует EditText.setText().

+0

Еще раз спасибо, Сергей :) – Odhran