目的:
我正在寻找一种将功能附加到按钮的onClickListener的方法。
插图
Button trigger = new Button(getActivity());
trigger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method1();
}
});
Button runMethod2Button = new Button(getActivity());
runMethod2Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method1();
method2();
}
});
Button runMethod3Button = new Button(getActivity());
runMethod3Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method1();
method3();
method4();
}
});
我知道我们可以通过调用继承来做到这一点
@Override
public void method(){
super.method();
// Do appended stuff
}
或者我们可以内联
new Object(){
@Override
public void method(){
super();
// Do appended stuff
}
}
我尝试过的事情
扩展按钮以包含可运行对象的列表。
然后设置单击监听器以触发所有可运行对象。
是否有其他/更有效的方式来做到这一点?
最佳答案
由于我们对背景的了解不多,因此很难做到最好。如果您希望原始监听器保持不变/不变,则可以使用装饰器/包装器模式。
Wikipedia Decorator Pattern
在具体情况下,这意味着它与Runnable
方法相当,但是您不依赖于其他接口(interface)。一切都通过View.OnClickListener
处理,它具有以下优点:
OnClickListeners
。在您的Runnable
方法中,扩展名是“特殊”的,例如,它们没有获得传递的View
方法的onClick
参数。public class OriginalOnClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"Original Click Listener",Toast.LENGTH_LONG).show();
}
}
public class ExtensionOnClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"Extension Click Listener",Toast.LENGTH_LONG).show();
}
}
public class DecoratorOnClickListener implements View.OnClickListener {
private final List<View.OnClickListener> listeners = new ArrayList<>();
public void add(View.OnClickListener l) {
listeners.add(l);
}
@Override
public void onClick(View v) {
for(View.OnClickListener l : listeners){
l.onClick(v);
}
}
}
用法是这样的:
DecoratorOnClickListener dl = new DecoratorOnClickListener();
dl.add(new OriginalOnClickListener());
dl.add(new ExtensionOnClickListener());
editText.setOnClickListener(dl);