我是android的新手,我正在尝试在Android中制作游戏。在那个游戏中我必须绘制画布,我按照教程学习“如何在android中绘制画布”。在该教程中,他使用了两个名为GFX和Main的类,他没有显示任何XML文件,所以我使用的是默认的XML,它是由eclipse编辑器自动填充的。
我已按照本教程进行操作,但当我尝试在设备上运行该应用程序时,设备屏幕上会显示一条消息,不幸的是,Seven已停止。“七”是我的应用程序名称。 “blackball”是我想在屏幕上显示的图像的名称。我已将此图像保存在res / drawable-hdpi文件夹中。 以下是代码,我添加了两个类,默认XML文件和Logcat。 GFX文件。
package com.example.seven;
import android.app.Activity;
import android.os.Bundle;
public class GFX extends Activity
{
Main objec;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
objec=new Main(this);
setContentView(objec);
}
}
主要
package com.example.seven;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
public class Main extends View
{
Bitmap blackdot;
public Main(Context context) {
super(context);
// TODO Auto-generated constructor stub
blackdot= BitmapFactory.decodeResource(getResources(), R.drawable.blackball);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawColor(Color.YELLOW);
canvas.drawBitmap(blackdot, (canvas.getWidth())/2, 0, null);
}
}
XML文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".Main" >
<TextView
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:text="@string/hello_world" />
</RelativeLayout>
以下是Logcat输出
03-11 12:26:13.968: D/dalvikvm(8248): newInstance failed: no <init>()
03-11 12:26:13.968: D/AndroidRuntime(8248): Shutting down VM
03-11 12:26:13.968: W/dalvikvm(8248): threadid=1: thread exiting with uncaught exception (group=0x40eca258)
03-11 12:26:13.970: E/AndroidRuntime(8248): FATAL EXCEPTION: main
03-11 12:26:13.970: E/AndroidRuntime(8248): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.seven/com.example.seven.Main}: java.lang.InstantiationException: can't instantiate class com.example.seven.Main; no empty constructor
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2001)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.app.ActivityThread.access$600(ActivityThread.java:134)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.os.Handler.dispatchMessage(Handler.java:99)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.os.Looper.loop(Looper.java:154)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.app.ActivityThread.main(ActivityThread.java:4624)
03-11 12:26:13.970: E/AndroidRuntime(8248): at java.lang.reflect.Method.invokeNative(Native Method)
03-11 12:26:13.970: E/AndroidRuntime(8248): at java.lang.reflect.Method.invoke(Method.java:511)
03-11 12:26:13.970: E/AndroidRuntime(8248): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
03-11 12:26:13.970: E/AndroidRuntime(8248): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
03-11 12:26:13.970: E/AndroidRuntime(8248): at dalvik.system.NativeStart.main(Native Method)
03-11 12:26:13.970: E/AndroidRuntime(8248): Caused by: java.lang.InstantiationException: can't instantiate class com.example.seven.Main; no empty constructor
03-11 12:26:13.970: E/AndroidRuntime(8248): at java.lang.Class.newInstanceImpl(Native Method)
03-11 12:26:13.970: E/AndroidRuntime(8248): at java.lang.Class.newInstance(Class.java:1319)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
03-11 12:26:13.970: E/AndroidRuntime(8248): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1992)
03-11 12:26:13.970: E/AndroidRuntime(8248): ... 11 more
这是清单文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.seven"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.seven.GFX"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.GFX" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
答案 0 :(得分:4)
Caused by: java.lang.InstantiationException: can't instantiate class com.example.seven.Main; no empty constructor
框架试图实例化您的活动时,stacktrace中的提示解释了此问题:您已将Main
类列为清单中的活动。该类不是Activity
,尽管实例化先前失败了,因为缺少空构造函数(因为你已经覆盖了构造函数),而不是稍后将创建的对象强制转换为Activity
。
似乎GFX
是您的主要活动。
要解决此问题,请将Main
活动从清单更改为GFX
。
在已修改的问题中,将action
保留为MAIN
:
<action android:name="android.intent.action.GFX" />
更改为
<action android:name="android.intent.action.MAIN" />
它是指定应用程序的主要入口点,名称与您的代码无关。
答案 1 :(得分:0)
您已覆盖默认的空构造函数。实际上,您不需要在此明确传递上下文。活动本身是上下文的子类。并且您始终可以在活动中使用getApplicationContext()
。因此,将构造函数更改为pulic Main()
可帮助您解决问题。
编辑:刚刚意识到它正在使用它的视图。因此,要获取视图的上下文,您可以调用getContext()
。
答案 2 :(得分:0)
您在CustomView的Constructor类中收到错误,请按此处解决
private static Context mContext;
public Main(Context context) {
this.mContext = context;
// TODO Auto-generated constructor stub
blackdot= BitmapFactory.decodeResource(getResources(), R.drawable.blackball);
}