2012-02-04 11 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

ヨあなたは間違ったリスナー、DialogInterface.OnClickListenerをインポートして使用しています。したがって、リスナーがトリガーされたときにアクティビティをDialogInterfaceにキャストできないため、エラーが発生します。 View.OnClickListenerを使用するとうまくいくはずです。

+0

ありがとう、これは確かに問題でした。 – tb96

0
setContentView(0x7f030000); 

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

これらの行 私は、問題は、私が置かラインに位置していることがわかりました強くお勧めします。ボタンのレイアウトでは...

をエラーが発生しやすい。.. あなたのコードは以下にするために、 `R.id.buttonname」構文を使用し、uはライン28あなたのコード

直接onclickの機能を実装するために伝えることができ、別のパラメータにJavaアクティビティで

android:onclick="functionName" 

を追加し、このような方法をfile..create、

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

そのようなXMLのonclickイベントは決してバインドしないでください。これは、再利用可能なXMLレイアウトを作成する目的に反するものです! – Jonathan

+0

@ジョナサン:原則としてWRTの再利用可能なコードに同意しますが、多くの状況でXMLレイアウトファイルのonClickリスナーをバインドするのに間違いはありません。 – Squonk

2

は、あなたがしなければならない、リソースの文字通りのIDを使用しないでください使用する:

R.id.your_id

Rは、あなたのリソースを保持して、動的に生成されたオブジェクトです。例えば

、あなたはとてもとしてのres /レイアウト/ 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 
     } 
    }); 
} 
0

あなたはbuttonLが実際

android.view.Viewであることをdoublecheckことができます。 OnClickListener

なく

android.content.DialogInterface。OnClickListener

(import文を確認してください)

また、あなたがDialogInterface.OnClickListenerを使用しているb.setOnClickListenerにブレークポイントを入れて、buttonL

0

の値/タイプを調べることができます。 onClick(DialogInterface arg0、int arg1)ではなく、onClick(View v)という関数を必要とするView.OnClickListenerを使用する必要があります。

エラーは、DialogInterface.OnClickListenerをダイアログ用に、後者をボタン用にView.OnClickListenerにキャストしようとすると、クラスキャスト例外です。

また、上記のようにRを使用しようとすると、その理由があります。

関連する問題