安卓:崩溃:二进制XML文件行:错误充气类(使用SurfaceView) [英] Android:Crash: Binary XML file line : Error inflating class (using SurfaceView)

查看:366
本文介绍了安卓:崩溃:二进制XML文件行:错误充气类(使用SurfaceView)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在安卓surfaceview并且在我试图按钮添加到这一点。 在surfaceview画布我画的东西。我有一个线程类,以保持图纸。

I'm having android surfaceview and in that i'm trying to add buttons to this. In the surfaceview canvas i draw something. And i have a thread class to keep drawing.

package com.androidsurfaceview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class androidsurfaceview extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button buttonShowHide = (Button)findViewById(R.id.showhide);
        final Button buttonDummy = (Button)findViewById(R.id.dummy);

        buttonShowHide.setOnClickListener(
                new Button.OnClickListener(){

                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        if(buttonDummy.getVisibility()==View.VISIBLE){
                            buttonDummy.setVisibility(View.GONE);
                        }
                        else{
                            buttonDummy.setVisibility(View.VISIBLE);
                        }
                    }

                }
        );

Thread类

The thread class

package com.androidsurfaceview;

import android.graphics.Canvas;
import android.view.SurfaceHolder;
public class MySurfaceThread extends Thread {
    private SurfaceHolder myThreadSurfaceHolder;
    private com.androidsurfaceview.test.MySurfaceView  myThreadSurfaceView;
    private boolean myThreadRun = false;

    public MySurfaceThread(SurfaceHolder surfaceHolder, com.androidsurfaceview.test.MySurfaceView surfaceView) {
        myThreadSurfaceHolder = surfaceHolder;
        myThreadSurfaceView = surfaceView;
    }

    public void setRunning(boolean b) {
        myThreadRun = b;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(myThreadRun){
            Canvas c = null;

            try{
                c = myThreadSurfaceHolder.lockCanvas(null);
                synchronized (myThreadSurfaceHolder){
                    myThreadSurfaceView.onDraw(c);
                }
                sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            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) {
                    myThreadSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
}

在surfaceview和放大器;类绘制

The surfaceview & the class for drawing

 package com.androidsurfaceview;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

 public class test extends Activity{

      //     ......
       //   I do a few things here... with this class test.

    public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{

        private MySurfaceThread thread;
        private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        int cx, cy, offx, offy;

        public MySurfaceView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            init();
        }

        public MySurfaceView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
            init();
        }

        public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
            init();
        }

         private void init(){
              getHolder().addCallback(this);
              thread = new MySurfaceThread(getHolder(), this);

              setFocusable(true); // make sure we get key events

              paint.setStyle(Paint.Style.STROKE);
              paint.setStrokeWidth(3);
              paint.setColor(Color.WHITE);

              cx = 0;
              cy = 0;
              offx = 10;
              offy = 10;

             }

        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            thread.setRunning(true);
            thread.start();

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            boolean retry = true;
            thread.setRunning(false);
            while (retry) {
                try {
                    thread.join();
                    retry = false;
                } 
                catch (InterruptedException e) {
                }
            }
        }
    ////Just a simple graphic of moving circle.
        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            canvas.drawRGB(0, 0, 0);
            canvas.drawCircle(cx, cy, 3, paint);
            cx += offx;
            if (cx > getWidth() || (cx < 0)){
                offx *= -1;
                cx += offx;
            }

            cy += offy;
            if (cy > getHeight() || (cy < 0)){
                offy *= -1;
                cy += offy;
            }
        }
    }
    }

下面是main.xml中

Here is the main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<Button
    android:id="@+id/showhide"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Toggle The Another Button Show/Hide" />
<Button
    android:id="@+id/dummy"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="a Button" />
<FrameLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

<com.androidsurfaceview.test.MySurfaceView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

</FrameLayout>
</LinearLayout>

问题:  上述code ++工程的如果我没有在MySurfaceView作为嵌套类。但随着外部类的测试我碰到下面的错误。如果删除了级测试 它工作正常。

PROBLEM: The above code works ONLY if i dont have the "MySurfaceView" as nested class. but with the outer class "test" I get the following error. If i remove the "class test" it works fine.

错误/崩溃

04-29 11:43:18.977: ERROR/AndroidRuntime(21832): FATAL EXCEPTION: main
04-29 11:43:18.977: ERROR/AndroidRuntime(21832): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidsurfaceview/com.androidsurfaceview.androidsurfaceview}: **android.view.InflateException: Binary XML file line #20: Error inflating class com.androidsurfaceview.test.MySurfaceView**
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.os.Looper.loop(Looper.java:123)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.ActivityThread.main(ActivityThread.java:4627)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at java.lang.reflect.Method.invokeNative(Native Method)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at java.lang.reflect.Method.invoke(Method.java:521)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at dalvik.system.NativeStart.main(Native Method)
**04-29 11:43:18.977: ERROR/AndroidRuntime(21832): Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class com.androidsurfaceview.test.MySurfaceView**
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:200)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.Activity.setContentView(Activity.java:1647)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at com.androidsurfaceview.androidsurfaceview.onCreate(androidsurfaceview.java:13)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-29 11:43:18.977: ERROR/AndroidRuntime(21832):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

任何帮助将是巨大的......我坚持这一点。

Any help will be great ...I'm stuck with this.

推荐答案

首先,你必须声明你的观点作为静态键入,要能够进行甚至夸大它当控股no类的实例可用:

First, you must declare your view as a static type, to be able to be inflated it even when no instance of the holding class is available:

public static class MySurfaceView extends SurfaceView 
    implements SurfaceHolder.Callback

<com.androidsurfaceview.test.MySurfaceView

在布局XML表明,该 MySurfaceView 类是 com.androidsurfaceview.test 包里面,试图从那里吹它,这是不对的。

in your layout xml suggests, that the MySurfaceView class is inside the com.androidsurfaceview.test package, and tries to inflate it from there, which is wrong.

在你的布局应该遵循的 package.class $内部类的形式声明。

In your layout you should follow the package.class$innerclass form of declaration.

,因为$是非法字符,你可以不写

BUT since the "$" is illegal character, you cannot write

<com.androidsurfaceview.test$MySurfaceView

所以你必须指定在布局XML观点如下:

so you must specify your view in the layout xml as follows:

<view class="com.androidsurfaceview.test$MySurfaceView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

此方式,它会工作。

这篇关于安卓:崩溃:二进制XML文件行:错误充气类(使用SurfaceView)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆