2012-08-31 28 views
2

我有一個「小」的問題,編寫我的應用程序.. 我有自定義對話框點擊按鈕後顯示什麼。 在這個自定義對話框中,我有一些textviews和按鈕.. 我想要以下內容:如果我點擊對話框中的按鈕,應用程序將開始調用(它不是問題的關鍵,它會做什麼)。自定義對話框 - 只有匿名聽衆工作

但問題是,我不能寫監聽器。所有的時候,如果我在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(延伸對話框)

從日誌10

輸出:

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

對話框類不延伸上下文,這是所必需的onClick屬性。

documentation

此名稱必須對應於需要的類型正好查看一個參數的公共方法。例如,如果您指定了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的建議)。

+0

可能愚蠢的問..但有擴展活動和實現dialogInterface的方式? (我不知道到底是什麼dialogInterface ..) – piggy

+0

謝謝!多數民衆贊成我所尋找的.. – piggy

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; 

     } 
    } 
} 
+0

這就是一個可能使代碼「更清潔」..謝謝,如果沒有其他的可能性,我會做到這一點.. – piggy

+0

這是更清潔的眼睛。謝謝! –