2011-04-23 72 views
3

我有一個活動,對於佈局中的每個小部件,我調用setOnClickListener()來分配我的OnClick()處理函數。在我的OnClick()處理程序中,我使用switch語句根據View參數的ID爲每個按鈕執行所需的代碼。有沒有辦法將默認處理程序分配給主視圖,而不必對視圖中的每個小部件進行單獨的偵聽程序分配調用?我可以爲Android活動分配「默認」OnClickListener()嗎?

============================================== ==

UPDATE

由於我已經編寫了其具有設置單擊處理程序中的活動的所有視圖元素共同單擊處理一個靜態方法的類的完整實現kcoppock的起始樣品。這適用於那些佈局簡單並且想要在使用基於View參數對象的ID的switch語句的常見click listener事件中執行所有事件處理的情況。要在Activity中使用它,只需撥打Misc.setDefaultClickHandler(this,this)。當然你的Activity需要實現View.OnclickListener接口。

package {put your package name here}; 

import android.app.Activity; 
import android.view.View; 
import android.view.ViewGroup; 

public class Misc { 

    public Misc() { 
     super(); 
    } 

    // Returns the root view for a given activity. 
    public static View getRootView(Activity activity) { 
     return activity.findViewById(android.R.id.content).getRootView(); 
    } 

    private static void assignClickHandler(View root, View.OnClickListener theOnClickListener) { 

     // Is it a View or a View group? 
     if (root instanceof ViewGroup) { 

      // It's a ViewGroup, process all it's children. 
      ViewGroup vg = (ViewGroup) root; 

      for(int i = 0; i < vg.getChildCount(); i++) 
       // Make recursive call. 
       assignClickHandler(vg.getChildAt(i), theOnClickListener); 
     } 
     else 
     { 
      // Child is a View. Set the desired context for the click handler. 
      root.setOnClickListener(theOnClickListener); 
     } 
    } 

    public static void setDefaultClickHandler(Activity activity, View.OnClickListener theOnClickListener) { 
     assignClickHandler(getRootView(activity), theOnClickListener); 
    } 
} 

- roschler

+0

你的意思是每個按鈕都會共享一個onClickListener? – 2011-04-23 02:25:14

回答

5

據我所知,但你可以只使用一個循環,這樣的事情:

ViewGroup root = findViewById(R.id.my_root_layout); 
final Context context = this; 
assignClickHandler(root); 

public void assignClickHandler(int root) { 
    for(int i = 0; i < root.getChildCount(); i++) { 
     if(root.getChildAt(i) instanceof ViewGroup) { 
      assignClickHandler(root.getChildAt(i)); 
     } 
     else { 
      (root.getChildAt(i)).setOnClickListener(context); 
     } 
    } 
} 

注意它遞歸調用任何嵌套佈局內爲好。我沒有測試過這個,所以我可能弄亂了一些語法,但是這個想法應該可行,如果你只是想避免手動設置每一個。

+0

優秀。這比一次一個地完成任務要好很多,一旦我編寫代碼,它就是一個單一的函數調用。謝謝。 – 2011-04-23 03:38:23

+0

不客氣!你可能可以在那裏編寫一些檢查,只配置Buttons,ImageButtons等,除了每個可能的View獲得點擊處理程序。不過,如果點擊處理程序中沒有任何代碼執行,那麼這一點將會非常重要。 – kcoppock 2011-04-23 06:06:11

相關問題