2011-04-23 73 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

相关问题