Android:Button.setOnClickListener在运行时发生错误

时间:2012-02-04 18:47:21

标签: android

我正在创建一个非常简单的应用程序,它必须在用户单击按钮时执行操作。我尝试使用OnClickListener执行此操作,但这会导致程序在运行时停止。我寻找不同的解决方案,但没有什么可以帮助我。 我发现问题位于我放置的行:Button.setOnClickListener

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(0x7f030000);

    Button b   = (Button) findViewById (0x7f05000a) ; 
    b.setOnClickListener((android.view.View.OnClickListener) buttonL) ;



}
private OnClickListener buttonL  = new OnClickListener ( ) {

    @Override
    public void onClick(DialogInterface arg0, int arg1) {
//perform action}   
};

Logcat给出的错误:

02-04 19:45:46.101: E/AndroidRuntime(27043): FATAL EXCEPTION: main
02-04 19:45:46.101: E/AndroidRuntime(27043): java.lang.RuntimeException: Unable to start activity ComponentInfo{me.sms.smsReminder/me.sms.smsReminder.SmsReminderActivity}: java.lang.ClassCastException: me.sms.smsReminder.SmsReminderActivity$1
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1830)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1851)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.app.ActivityThread.access$1500(ActivityThread.java:132)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.os.Looper.loop(Looper.java:150)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.app.ActivityThread.main(ActivityThread.java:4277)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at java.lang.reflect.Method.invokeNative(Native Method)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at java.lang.reflect.Method.invoke(Method.java:507)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at dalvik.system.NativeStart.main(Native Method)
02-04 19:45:46.101: E/AndroidRuntime(27043): Caused by: java.lang.ClassCastException: me.sms.smsReminder.SmsReminderActivity$1
02-04 19:45:46.101: E/AndroidRuntime(27043):    at me.sms.smsReminder.SmsReminderActivity.onCreate(SmsReminderActivity.java:28)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
02-04 19:45:46.101: E/AndroidRuntime(27043):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1794)
02-04 19:45:46.101: E/AndroidRuntime(27043):    ... 11 more

谢谢,汤姆

5 个答案:

答案 0 :(得分:2)

不要使用资源的文字ID,您应该使用:

R.id.your_id

R是一个动态生成的对象,用于保存您的资源。

例如,如果您在res / layout / main.xml中定义了TextView,那么:

<TextView
    android:id="@+id/myTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:text="Test Type"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="@color/BLACK_TEXTCOLOR"
    android:textStyle="bold" />

您可以将其引用为:

R.id.myTextView

我还建议您使用匿名类点击绑定:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.myLayoutId);

    Button b   = (Button) findViewById (R.id.myButton) ; 
    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //perform action
        }
    });
}

答案 1 :(得分:1)

您已导入并使用了错误的侦听器DialogInterface.OnClickListener。因此,当触发器被触发时,您的活动无法转换为DialogInterface,因此会出现错误。使用View.OnClickListener它应该可以工作。

答案 2 :(得分:0)

setContentView(0x7f030000);

Button b   = (Button) findViewById (0x7f05000a) ; 

强烈建议不要使用这些行。使用`R.id.buttonname'语法使代码不易出错。 你可以告诉第28行你的代码

直接实现onclick功能...

在按钮布局中,添加另一个参数

 android:onclick="functionName"

在java活动文件中..然后创建一个这样的方法,

public void functionName(View v)
{
//Tasks to perform at on click event
}

答案 3 :(得分:0)

你可以双击那个buttonL确实是

  

android.view.View。 OnClickListener

而不是

  

android.content.DialogInterface.OnClickListener

(检查导入语句)

你也可以在b.setOnClickListener上放一个断点并检查buttonL的值/类型

答案 4 :(得分:0)

您正在使用DialogInterface.OnClickListener。您需要使用View.OnClickListener,它需要onClick(View v)函数,而不是onClick(DialogInterface arg0,int arg1)。

当您尝试将DialogInterface.OnClickListener转换为View.OnClickListener时,错误是一个类转换异常,因为一个用于对话框,后一个用于按钮。

同样如上所述,尝试使用R.它生成的原因是你应该使用它...