目标: 我正在寻找一种将功能附加到按钮的 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
}
}
我尝试过的事情
扩展按钮以包含可运行对象列表。 然后设置点击监听器来触发所有可运行的对象。
是否有不同/更有效的方法来做到这一点?
最佳答案
由于我们不太了解您为什么要这样做的背景,因此很难确定什么是最好的。如果您想让原始监听器保持不变/不受影响,您可以使用装饰器/包装器模式。
在具体情况下,这意味着它与您的 Runnable
方法相当,但您不依赖于另一个接口(interface)。一切都是通过 View.OnClickListener
处理的,它具有以下优点:
- 这是一种通用方法,您甚至可以使用它“扩展”您无法访问源代码或不想修改的监听器。
- 您可以在运行时创建扩展行为,并且可以扩展已经实例化的监听器(与使用继承相反)
扩展不必知道它们是扩展,它们只是普通的
OnClickListeners
。在您的Runnable
方法中,扩展是“特殊的”,例如,它们没有获得传递的onClick
方法的View
参数。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);
关于android - 将功能动态附加到 Button 的 onclicklistener Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519313/