添加onClickListener时崩溃

时间:2011-07-25 12:41:02

标签: android

可能是一个相当简单的问题,但我似乎无法理解我为什么添加任何onClickListeners。 (当我将一个文本更改的监听器添加到EditText框时,我似乎也遇到类似的崩溃,这让我觉得我一直在设置错误的东西?)

我按照基本的Android开发人员的内容创建了一个onClickListener,如下所示......

        mPickDate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog(DATE_DIALOG_ID);
        }
    });

但是,我想创建Listener,然后使用onCreate方法来执行代码。

这是我当前的设置,一旦我运行它就会崩溃

package com.chris.formStuff;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class FormStuffActivity extends Activity implements OnClickListener {

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

    // Load all views.
    //EditText edtText1;
    Button btnChange1;

    // And find all views in the relevant layout file
    //edtText1=(EditText) findViewById(R.layout.main);
    btnChange1 = (Button) this.findViewById(R.layout.main);

    btnChange1.setOnClickListener((OnClickListener) this);
}
@Override
public void onClick(View v)
{
    Context context = getApplicationContext();
    CharSequence text = "Hello toast!";
    int duration = Toast.LENGTH_SHORT;

    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
}
}

logcat输出......

07-25 13:19:10.593: ERROR/AndroidRuntime(22861): FATAL EXCEPTION: main
07-25 13:19:10.593: ERROR/AndroidRuntime(22861): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chris.formStuff/com.chris.formStuff.FormStuffActivity}: java.lang.ClassCastException: com.chris.formStuff.FormStuffActivity
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.app.ActivityThread.access$2300(ActivityThread.java:135)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.os.Looper.loop(Looper.java:144)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.app.ActivityThread.main(ActivityThread.java:4937)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at java.lang.reflect.Method.invoke(Method.java:521)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at dalvik.system.NativeStart.main(Native Method)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861): Caused by: java.lang.ClassCastException: com.chris.formStuff.FormStuffActivity
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at com.chris.formStuff.FormStuffActivity.onCreate(FormStuffActivity.java:25)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
07-25 13:19:10.593: ERROR/AndroidRuntime(22861):     ... 11 more

5 个答案:

答案 0 :(得分:3)

变化 btnChange1 = (Button) this.findViewById(R.layout.main);

btnChange1 = (Button) this.findViewById(R.id.buttonchange_id);

其中buttonchange_id是主布局中btnChange1的id

答案 1 :(得分:2)

每个人都很快指出你的问题就在这一行

btnChange1 = (Button) this.findViewById(R.id.buttonchange_id);

他们是对的,这将为你解决这个问题。但如果你想避免将来出现问题,最好还是明白为什么。

logcat通常会使修复错误非常简单。当您收到错误时,logcat输出通常如下所示

07-25 13:19:10.593: ERROR/AndroidRuntime(22861): FATAL EXCEPTION: main
ERROR/AndroidRuntime(22861): java.lang.RuntimeException: /some sort of error/
    .../A lot of description/
    ...
07-25 13:19:10.593: ERROR/AndroidRuntime(22861): Caused by: /Whatever the specific error was/
    07-25 13:19:10.593: ERROR/AndroidRuntime(22861):at com.chris.formStuff.FormStuffActivity.onCreate(FormStuffActivity.java:25)
    ...
    ...

当你遇到这样的错误时,你想要查看“由...引起的”行,以及之后的前几行。这将描述错误并为您提供它所发生的确切行。在您的情况下,错误是FormStuffActivity中第25行的“ClassCastException”。然后,当你看第25行时,你可以看到你必须向Button投射一些东西,实际上不是一个Button(正如其他人所说的那样)。

如果错误是第406行的NullPointerException,您将知道在该行上查找尚未正确初始化的变量。 logcat是一个非常强大的调试工具,如果你学习如何使用它,你可以在几秒钟内修复像这样的小型语法类型的错误。

答案 2 :(得分:1)

您的按钮必须通过main.xml中的ID找到,而R.layout.main不是他的ID。

btnChange1 = (Button) this.findViewById(R.layout.nameofthebuttoninsidethexml);

答案 3 :(得分:1)

你在这一行出错了

btnChange1 =(按钮)this.findViewById(R.layout.main);

表示您需要找到 id 而不是布局

与此行相同

btnChange1 =(按钮)this.findViewById(R.id.button);

答案 4 :(得分:0)

根据您的堆栈跟踪,您的错误在此行中:  (Button) this.findViewById(R.layout.main);显然R.layout.main不是一个按钮。