2

アプリケーションの作成に「小さな」問題があります。ボタンをクリックすると表示されるカスタムダイアログがあります。このカスタムダイアログには、いくつかのテキストビューとボタンがあります。次が必要です。ダイアログのボタンをクリックすると、アプリケーションが呼び出しを開始します(問題のポイントではなく、何でも実行します)。

しかし問題は、リスナーを書くことができないということです。リスナーをxmlレイアウトファイルに書き込むと、アプリケーションがクラッシュします。1つの解決策があります-匿名リスナーのようにリスナーを記述します。しかし、私は匿名リスナーがあまり好きではありません(レイアウトに100個のボタンがあり、すべてのボタンに匿名リスナーを追加する必要がある場合、コードはかなり混乱します)。

View.OnClickListener()またはDialogInterface.OnClickListener()を作成する必要があるかどうかはわかりません-最初のものだと思いますが、わかりません。匿名リスナーはビュー1で機能し、非匿名(xmlレイアウトファイル上)は1秒でも機能しません..誰かが私に「なぜ」と言うことができますか?

コード:

この作品:

    b.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Log.e("err","I am here");   
        }
    });

これは機能しません:

-xml_layout_file

<Button 
    android:id="@+id/btn_startCall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onClick_startCall"
    android:text="@string/btn_startCall" /> 

-myDialog.java(ダイアログを拡張します)

public void onClick_startCall(View v){
    Log.e("err","I am here");       
}

ログからの出力:

08-31 22:08:05.469: W/dalvikvm(9456): threadid=1: thread exiting with uncaught exception (group=0x40a3b1f8)
08-31 22:08:05.475: E/AndroidRuntime(9456): FATAL EXCEPTION: main
08-31 22:08:05.475: E/AndroidRuntime(9456): java.lang.IllegalStateException: Could not find a method onClick_startCall(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id 'btn_startCall'
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.view.View$1.onClick(View.java:3031)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.view.View.performClick(View.java:3511)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.view.View$PerformClick.run(View.java:14105)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.os.Handler.handleCallback(Handler.java:605)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.os.Looper.loop(Looper.java:137)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.app.ActivityThread.main(ActivityThread.java:4673)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at java.lang.reflect.Method.invokeNative(Native Method)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at java.lang.reflect.Method.invoke(Method.java:511)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at dalvik.system.NativeStart.main(Native Method)
08-31 22:08:05.475: E/AndroidRuntime(9456): Caused by: java.lang.NoSuchMethodException: onClick_startCall [class android.view.View]
08-31 22:08:05.475: E/AndroidRuntime(9456):     at java.lang.Class.getConstructorOrMethod(Class.java:460)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at java.lang.Class.getMethod(Class.java:915)
08-31 22:08:05.475: E/AndroidRuntime(9456):     at android.view.View$1.onClick(View.java:3024)
08-31 22:08:05.475: E/AndroidRuntime(9456):     ... 11 more
4

2 に答える 2

2

通常、私はすべてのボタンにリンクされた1つのリスナーを持つことを好みます

// in onCreate() method
MyListener buttonListener = new MyListener();
button1.setOnClickListener(buttonListener);
button2.setOnClickListener(buttonListener);
button3.setOnClickListener(buttonListener);

// definition of my listener (inner or simple class)
public class MyListener implements View.OnClickListener {

    public void onClick(View v) {
        switch (v.getId()) {
           case R.id.button1 :
             // Do this for button 1
             break;

           case R.id.button2 :
             // Do this for button 2
             break;

           case R.id.button3 :
             // Do this for button 3
             break;

        } 
    }
}
于 2012-08-31T20:18:31.693 に答える
2

onClickDialogクラスは、属性に 必要なContextを拡張しません。

ドキュメントから

この名前は、View型のパラメーターを1つだけ取るパブリックメソッドに対応している必要があります。たとえば、android:onClick = "sayHello"を指定する場合は、コンテキスト(通常はアクティビティ)のpublic void sayHello(View v)メソッドを宣言する必要があります。


あなたはこれを行うことができます:

OnClickListener startButtonListener = new View.OnClickListener() {
    public void onClick(View v) {
        Log.e("err","I am here");   
    }
});

そして後でそれを参照してください:

b.setOnClickListener(startButtonListener);

これがあなたのコードをより良く整理するのに役立つなら(私はそれが好きで、Orabigの提案と一緒に)。

于 2012-08-31T20:21:36.863 に答える