Java compass应用程序无法实例化活动
我正在尝试制作一个基于指南针的应用程序。我有两个java文件,一个是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) {
指南针
类,它扩展了视图
,第二个是传感器
类。在与后一个类相关的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"