我可以为Android活动分配“默认”OnClickListener()吗?

时间:2011-04-23 00:19:04

标签: android layout view android-activity onclick

我有一个Activity,对于布局中的每个小部件,我调用setOnClickListener()来分配我的OnClick()处理程序。在我的OnClick()处理程序中,我使用switch语句根据View参数的ID为每个按钮执行所需的代码。有没有办法将默认处理程序分配给主视图,而不必为视图中的每个窗口小部件进行单独的侦听器分配调用?

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

更新

感谢kcoppock的开始示例,我编写了一个类的完整实现,该类具有静态方法,该方法将Activity中所有View元素的click处理程序设置为常用的单击处理程序。这适用于您具有简单布局并且您希望在使用基于View参数对象ID的switch语句的常见单击侦听器事件中执行所有事件处理的情况。要在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

1 个答案:

答案 0 :(得分: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);
        }
    }
}

请注意,它也可以递归调用任何嵌套布局。我没有对此进行测试,所以我可能搞砸了一些语法,但如果您只是想避免手动设置每个语法,那么这个想法应该可行。