编写应用程序时出现“小”问题。 我有点击按钮后显示的自定义对话框。 在这个自定义对话框上,我有一些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
答案 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
属性所必需的。
此名称必须对应于只接受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的建议)。