2012-02-04 4 views
1

Я делаю очень простое приложение, которое должно выполнить действие, когда пользователь нажимает кнопку. Я пытался сделать это с помощью OnClickListener, но это заставляет программу останавливаться во время время выполнения. Я искал разные решения, но ничто не могло мне помочь. я обнаружил, что проблема находится на линии, где я поместил: Button.setOnClickListenerAndroid: 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 

Спасибо, Том

ответ

1

Yo u импортировали и используют неверный прослушиватель DialogInterface.OnClickListener. И поэтому есть ошибка, так как ваша активность не может быть запущена в DialogInterface при запуске слушателя. Используйте View.OnClickListener, и он должен работать.

+0

Спасибо, это действительно проблема. – tb96

0
setContentView(0x7f030000); 

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

Эти линии настоятельно не рекомендуется. используйте синтаксис `R.id.buttonname», чтобы сделать код менее подвержены ошибкам .. и может у линии 28 для кода

Для непосредственного осуществления OnClick функциональности сказать ...

В макете кнопки, добавить еще один параметр

android:onclick="functionName" 

В Java деятельности file..create метод, как это тогда,

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

Вы никогда не должны связывать OnClick события в XML, как это. Это поражает цель создания многоразовых XML-макетов! – Jonathan

+0

@ Jonathan: Хотя я согласен в принципе с многократно используемым кодом WRT, нет ничего плохого в привязке onClick-прослушивателей в файлах макета XML во многих ситуациях. – Squonk

2

не используйте буквальный идентификатор ресурсов, вы должны быть с помощью:

R.id.your_id

R представляет собой динамически объект, который держит свои ресурсы.

Например, если у вас есть TextView, определенный в Рез/макет/main.xml, как так:

<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 
     } 
    }); 
} 
0

Вы можете перепроверить, что buttonL действительно является

android.view.View. OnClickListener

и не

android.content.DialogInterface.OnClickListener

(проверьте операторы импорта)

Вы также могли бы поставить точку останова на b.setOnClickListener и проверить значение/тип buttonL

0

Вы используете DialogInterface.OnClickListener. Вам нужно использовать View.OnClickListener, для которого требуется функция onClick (View v), NOT onClick (DialogInterface arg0, int arg1).

Ошибка при исключении класса при попытке применить метод DialogInterface.OnClickListener к View.OnClickListener, поскольку он предназначен для диалогов, а последний для кнопок.

Кроме того, как упоминалось выше, пытаются использовать R. Его генерироваться по причине, так что вы должны использовать его ...

Смежные вопросы