目的: 我正在寻找一种方法将功能附加到按钮的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
}
}
我尝试过的事情
扩展按钮以包含可运行对象列表。 然后设置on click侦听器以触发所有可运行的对象。
有没有不同/更有效的方法呢?
答案 0 :(得分:4)
由于我们对你想要这样做的背景知之甚少,所以很难做到最好。如果你想让原始监听器保持不变/不变,你可以使用装饰器/包装器模式。
在具体案例中,这意味着,它与您的$dir = 'C:\Program Files'
方法相当,但您不依赖于其他界面。 Everthing通过Runnable
处理,具有以下优点:
扩展程序不必知道它们是扩展程序,它们只是正常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);
}
}
}
答案 1 :(得分:1)
根据你在这里说的话,我认为Runnable的想法还可以。看到我真的不知道为什么你需要动态点击处理程序,我认为可能的解决方案看起来像这样:
private class DynamicOnClickListener implements View.OnClickListener {
private final List<Runnable> mRunnables = new ArrayList<>();
public void add(Runnable r) {
mRunnables.add(r);
}
@Override
public void onClick(View v) {
for (Runnable r : mRunnables) {
r.run();
}
}
}
你会像这样使用它:
DynamicOnClickListener listener = new DynamicOnClickListener();
listener.add(new Runnable() {
@Override
public void run() {
doSomething();
}
});
listener.add(new Runnable() {
@Override
public void run() {
doSomethingElse();
}
});
mButton.setOnClickListener(listener);
答案 2 :(得分:0)
像
这样的东西 Button trigger = new Button(getActivity());
trigger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method1();
if (someVar) method2();
if (someVar2) method3();
}
})