【问题标题】:Custom dialog - only anonymous listeners work自定义对话框 - 只有匿名侦听器有效
【发布时间】:2012-08-26 15:48:33
【问题描述】:

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

但问题是,我无法编写侦听器。一直以来,如果我在 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(扩展对话框)

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

【问题讨论】:

    标签: android button dialog listener


    【解决方案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;
    
            } 
        }
    }
    

    【讨论】:

    • 这是使代码“更干净”的一种可能..谢谢,如果没有其他可能性,我会这样做..
    • 这样在眼睛里更干净。谢谢!
    【解决方案2】:

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

    来自documentation

    此名称必须对应于只采用一个 View 类型参数的公共方法。例如,如果您指定 android:onClick="sayHello",则必须声明您的上下文(通常是您的 Activity)的 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 的建议)。

    【讨论】:

    • 可能是愚蠢的问..但是有没有办法扩展活动和实现对话框接口? (我不确切知道什么是 dialogInterface..)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多