不幸的是,(应用程序名称)已停止

时间:2014-03-11 07:25:52

标签: android android-canvas

我是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>

3 个答案:

答案 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);
    }