Такой метод не существует - PullRequest
       13

Такой метод не существует

1 голос
/ 08 февраля 2012

Я играл с кодом, который нашел на Разработка Android - Игра с графикой в ​​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>

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

1 Ответ

1 голос
/ 09 февраля 2012

Вот полезный пост Ошибка надувания внутреннего представления класса

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

выдержка отсюда

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...