2014-02-17 55 views
0

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

例如,在RadioGroup中:

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

我会假设一组监听器将保持(或链接),并通过迭代上的赛事转播。相反,无论哪个听众是最后一次设置“胜利”。这似乎很脆弱。

这是什么原理?

+0

如果您想保留默认侦听器,则可以始终扩展OnCheckedChangeListener,如MyOnCheckedChangeListener并从子类中调用super。 –

+0

NAA,但我不认为这是脆弱的。当你设置一个监听器时,你应该完全知道*从那一点开始将调用什么方法。你不应该担心之前的听众是什么。如果你需要更多的东西,你可以扩展/改变它以用于特定用途,但我不认为它应该是默认的。 – Geobits

回答

1

这主要是为了处理像UI分层的事情。例如,您可能有背景,其上有View A,可处理点击 - 但您在用户单击按钮时显示View B以上A。现在,如果您点击B,您不希望A作出回应。它的意思是简化。

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

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

例如,从接口开始,该接口的方法返回truefalseOnCheckedChange不这样做(移动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,只让所有的听众被调用(按顺序)。