Java compass应用程序无法实例化活动

Java compass应用程序无法实例化活动,java,android,view,Java,Android,View,我正在尝试制作一个基于指南针的应用程序。我有两个java文件,一个是指南针类,它扩展了视图,第二个是传感器类。在与后一个类相关的xml文件中,有一个项,如下所示。问题是,当我运行应用程序时,它崩溃,logcat生成以下输出。请帮我解决这个问题 XML: CompassClass: public class CompassTest00 extends View { private float direction; public CompassTest00(Context context) {

我正在尝试制作一个基于指南针的应用程序。我有两个java文件,一个是
指南针
类,它扩展了
视图
,第二个是
传感器
类。在与后一个类相关的xml文件中,有一个
项,如下所示。问题是,当我运行应用程序时,它崩溃,logcat生成以下输出。请帮我解决这个问题

XML:

CompassClass:

public class CompassTest00 extends View {

private float direction;

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

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

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
      MeasureSpec.getSize(heightMeasureSpec));      
}

 @Override
 protected void onDraw(Canvas canvas) {
      int w = getMeasuredWidth();
      int h = getMeasuredHeight();
      int r;
      if(w > h){
      r = h/2;
       }else{
        r = w/2;
       }
      Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
      paint.setStyle(Paint.Style.STROKE);
      paint.setStrokeWidth(5);
      paint.setColor(Color.WHITE);

      canvas.drawCircle(w/2, h/2, r, paint);

      paint.setColor(Color.RED);
      canvas.drawLine(
        w/2,
        h/2,
        (float)(w/2 + r * Math.sin(-direction)),
        (float)(h/2 - r * Math.cos(-direction)),
        paint);
}

 public void update(float dir){
      direction = dir;
      invalidate();
     }  
}
文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compasstest00"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.compasstest00.CompassTest00"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.compasstest00.AndroidSensors"
        android:label="@string/title_activity_android_sensors" >
    </activity>
</application>

日志输出:

04-22 02:50:06.817: D/dalvikvm(8545): newInstance failed: no <init>()
04-22 02:50:06.817: D/AndroidRuntime(8545): Shutting down VM
04-22 02:50:06.817: W/dalvikvm(8545): threadid=1: thread exiting with uncaught  
exception (group=0x419a1700)
04-22 02:50:06.817: E/AndroidRuntime(8545): FATAL EXCEPTION: main
04-22 02:50:06.817: E/AndroidRuntime(8545): java.lang.RuntimeException: Unable to  
instantiate activity   
ComponentInfo{com.example.compasstest00/com.example.compasstest00.CompassTest00}:   
java.lang.InstantiationException: can't instantiate class   
com.example.compasstest00.CompassTest00; no empty constructor
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2232)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at  
android.app.ActivityThread.access$700(ActivityThread.java:168)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
android.os.Handler.dispatchMessage(Handler.java:99)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at 
android.os.Looper.loop(Looper.java:137)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at 
android.app.ActivityThread.main(ActivityThread.java:5493)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
java.lang.reflect.Method.invokeNative(Native Method)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
java.lang.reflect.Method.invoke(Method.java:525)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at  
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
dalvik.system.NativeStart.main(Native Method)
04-22 02:50:06.817: E/AndroidRuntime(8545): Caused by:   
java.lang.InstantiationException: can't instantiate class    
com.example.compasstest00.CompassTest00; no empty constructor
04-22 02:50:06.817: E/AndroidRuntime(8545):     at  
java.lang.Class.newInstanceImpl(Native Method)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at  
java.lang.Class.newInstance(Class.java:1130)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at    
android.app.Instrumentation.newActivity(Instrumentation.java:1078)
04-22 02:50:06.817: E/AndroidRuntime(8545):     at   
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2223)
04-22 02:50:06.817: E/AndroidRuntime(8545):     ... 11 more
04-22 02:50:06.817:D/dalvikvm(8545):新实例失败:否()
04-22 02:50:06.817:D/AndroidRuntime(8545):关闭虚拟机
04-22 02:50:06.817:W/dalvikvm(8545):threadid=1:线程未捕获退出
异常(组=0x419a1700)
04-22 02:50:06.817:E/AndroidRuntime(8545):致命异常:主
04-22 02:50:06.817:E/AndroidRuntime(8545):java.lang.RuntimeException:无法
实例化活动
ComponentInfo{com.example.compasstest00/com.example.compasstest00.compasstest00}:
java.lang.InstanceionException:无法实例化类
com.example.compasstest00.compasstest00;没有空构造函数
04-22 02:50:06.817:E/AndroidRuntime(8545):在
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2232)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
access$700(ActivityThread.java:168)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
android.os.Handler.dispatchMessage(Handler.java:99)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
Looper.loop(Looper.java:137)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
main(ActivityThread.java:5493)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
java.lang.reflect.Method.Invokenactive(本机方法)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
java.lang.reflect.Method.invoke(Method.java:525)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
dalvik.system.NativeStart.main(本机方法)
04-22 02:50:06.817:E/AndroidRuntime(8545):由以下原因引起:
java.lang.InstanceionException:无法实例化类
com.example.compasstest00.compasstest00;没有空构造函数
04-22 02:50:06.817:E/AndroidRuntime(8545):在
java.lang.Class.newInstanceImpl(本机方法)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
java.lang.Class.newInstance(Class.java:1130)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
android.app.Instrumentation.newActivity(Instrumentation.java:1078)
04-22 02:50:06.817:E/AndroidRuntime(8545):在
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2223)
04-22 02:50:06.817:E/AndroidRuntime(8545):。。。还有11个
试试这个:

<com.example.compasstest00.CompassTest00 
    android:id="@+id/mycompass" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" />

而不是:

<view 
    android:id="@+id/mycompass" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    class="com.example.compasstest00.CompassTest00"/>

更新:

事实上,在XML中声明自定义视图的两种方法都应该有效。实际问题在Android清单中:

 <activity
    android:name="com.example.compasstest00.CompassTest00"
您已将自定义视图声明为活动。这就是为什么
ActivityThread.performLaunchActivity
未能实例化它的原因。(因为它不应该!)


==>您应该在android清单中声明一个活动类。然后,此活动可以将customview设置为其内容视图。

您是否尝试了
而不是
?我想我们需要查看
CompassTest00
类。那么,我应该将版面宽度和其他项目放在哪里?您可以解释更多吗?我应该发布compass类吗?是的,您应该发布compass类,对于该视图,您可以按原样编写
,当我尝试回答时,没有
类=
,按ctrl+space“auto complete”不会显示我的类名,就好像它不可识别一样。在我的项目中,ctrl+space以xml表示类名。不知道为什么它不为你这样做。但是,请尝试此代码并保存xml。在运行应用程序之前也要清理项目。在我的应用程序中,我应该在构造函数中写一些东西吗?尽管你更新的答案是正确的,但我在logcat中遇到了另一个问题,我会创建一个新问题。非常感谢。
<view 
    android:id="@+id/mycompass" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    class="com.example.compasstest00.CompassTest00"/>
 <activity
    android:name="com.example.compasstest00.CompassTest00"