【问题标题】:Can I assign a "default" OnClickListener() for an Android Activity?我可以为 Android Activity 分配“默认” OnClickListener() 吗?
【发布时间】:2011-08-11 07:12:32
【问题描述】:

我有一个 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);
    }
}

-- 罗施勒

【问题讨论】:

  • 你的意思是每个按钮都会共享1个onClickListener?

标签: android layout view android-activity onclick


【解决方案1】:

据我所知,您可以使用循环,如下所示:

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

请注意,它还会递归调用其中的任何嵌套布局。我没有对此进行测试,所以我可能弄乱了一些语法,但如果你只是想避免手动设置每个语法,这个想法应该可行。

【讨论】:

  • 优秀。这比一次做一个作业要好得多,一旦我把它编码好,它就是一个函数调用。谢谢。
  • 不客气!您可能会在其中编写一些检查代码以仅配置按钮、图像按钮等,而不是每个可能的视图都获取单击处理程序。不过,如果点击处理程序中的任何代码都没有执行,这并不重要。
猜你喜欢
  • 2011-07-08
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2016-06-10
  • 2013-10-11
相关资源
最近更新 更多