自定义对话框 - 只有匿名侦听器才有效

时间:2012-08-31 20:10:24

标签: android button dialog listener

编写应用程序时出现“小”问题。 我有点击按钮后显示的自定义对话框。 在这个自定义对话框上,我有一些textview和按钮.. 我想要以下内容:如果我点击对话框中的按钮,应用程序将开始调用(它不是问题点,它会做任何事情)。

但问题是,我无法编写听众。如果我在xml布局文件中编写监听器,我的应用程序崩溃了。 有一个解决方案 - 像匿名监听器一样编写监听器。但是我不喜欢匿名听众(如果你的布局有100个按钮,你需要添加匿名监听器的所有按钮,代码会很混乱)。

我不确定我是否需要编写View.OnClickListener()或DialogInterface.OnClickListener() - 我认为第一个但我不确定。匿名监听器使用视图一,非匿名(在xml布局文件中)不能正常工作一秒和秒......任何人都可以说我“为什么”??

代码:

这项工作:

    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(扩展Dialog)

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

2 个答案:

答案 0 :(得分:2)

通常,我更喜欢有一个听众,链接到所有按钮

// 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;

        } 
    }
}

答案 1 :(得分:2)

Dialog类不扩展Context,这是onClick属性所必需的。

来自documentation

  

此名称必须对应于只接受View类型的一个参数的公共方法。例如,如果指定android:onClick =“sayHello”,则必须声明上下文的公共void sayHello(View v)方法(通常是您的Activity)。


你可以这样做:

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

稍后参考:

b.setOnClickListener(startButtonListener);

如果这有助于您更好地整理代码(我喜欢它,以及Orabig的建议)。