我能为Android Activity分配一个“默认”的OnClickListener()吗?

3
我有一个Activity,在布局中为每个小部件调用setOnClickListener()来分配我的OnClick()处理程序。 在我的OnClick()处理程序中,我使用switch语句根据View参数的ID执行每个按钮所需的代码。 有没有一种方法可以为主视图分配默认处理程序,而不必为视图中的每个小部件进行单独的监听器分配调用?
================================================
更新
感谢kcoppock的起始示例,我编写了一个完整的类实现,该类具有一个静态方法,将Activity中所有View元素的单击处理程序设置为公共单击处理程序。 这适用于您有一个简单的布局并且希望在基于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


每个按钮将共享一个onClick监听器吗? - Dr.J
1个回答

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);
        }
    }
}

请注意,它也会递归调用其中嵌套的布局。我没有测试过这个代码,所以可能有一些语法错误,但是这个思路应该是可行的,如果你只是想避免手动设置每一个布局。


太好了。这比一个一个地完成任务要好得多,一旦我编写好它,就只需要一个函数调用。谢谢。 - Robert Oschler
不客气!您可以在其中编写一些检查代码,以仅配置按钮、图像按钮等,而不是每个可能的视图都获取单击处理程序。虽然如果单击处理程序中的代码从未执行,这并不会太重要。 - Kevin Coppock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接