Android视图一次只允许一个监听器?

时间:2014-02-17 16:13:30

标签: android

通过Android视图代码(特别是在RadioButton和RadioGroup),我看到两个类一次只允许一个侦听器(外部提供 - 它们也有自己的内部侦听器)。设置第二个Listener只会覆盖:

例如,在RadioGroup:

public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
    mOnCheckedChangeListener = listener;
}

我假设一组监听器将被保留(或链接),并在事件广播中迭代。相反,最后设置的听众“获胜”。这似乎很脆弱。

这是什么原因?

1 个答案:

答案 0 :(得分:1)

这主要用于处理UI分层等事情。例如,您可能有背景,其上方有View A来处理点击次数 - 但是当用户点击按钮时,您会在View B上方显示A。现在,如果您点击B,则不希望A回复。这意味着简化。

如评论中所述,某些事件可以在处理点击后返回false,例如,以便下一层可以处理该事件。

如果您确实创建了对等待点击事件的所有对象的引用,则可以使用有序数据结构(例如ArrayList)来确保处理事件的顺序不是随机。

例如,从接口开始,该接口具有返回truefalse的方法。 OnCheckedChange不会这样做(移动了d

public interface OnCheckChangedListener {
    public boolean onCheckChanged(CompoundButton buttonView, boolean isChecked)
}

现在使用以下全局变量创建RadioGroup的子类:

private List<OnCheckChangedListener> listeners = new ArrayList<OnCheckChangedListener>();

然后有方法:

public void addOnCheckChangedListener(OnCheckChangedListener listener) {
    this.listeners.add(listener);
}

public void removeOnCheckChangedListener(OnCheckChangedListener listener) {
    this.listeners.remove(listener);
}

然后在你的构造函数中,添加:

this.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChange(CompoundButton buttonView, boolean isChecked) {
        for (int i = 0; i < listeners.size(); i++) {
            if (listeners.get(i).onCheckChanged(buttonView, isChecked))
                break;
        }
    }
});

现在所有听众都有机会回复,但订单将会像onClickonTouch一样处理。你也不能调用break,只是让所有的听众都被调用(按顺序)。