动态地将功能附加到Button的onclicklistener Android上

时间:2015-05-29 00:37:09

标签: android onclicklistener

目的: 我正在寻找一种方法将功能附加到按钮的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侦听器以触发所有可运行的对象。

有没有不同/更有效的方法呢?

3 个答案:

答案 0 :(得分:4)

由于我们对你想要这样做的背景知之甚少,所以很难做到最好。如果你想让原始监听器保持不变/不变,你可以使用装饰器/包装器模式。

Wikipedia Decorator Pattern

在具体案例中,这意味着,它与您的$dir = 'C:\Program Files'方法相当,但您不依赖于其他界面。 Everthing通过Runnable处理,具有以下优点:

  1. 这是一种通用的方法,您甚至可以“扩展”您没有源访问权限或您不想修改的侦听器。
  2. 您可以在运行时创建扩展行为,并且可以扩展已经实例化的侦听器(与继承的使用相反)
  3. 扩展程序不必知道它们是扩展程序,它们只是正常View.OnClickListener。在OnClickListeners方法中,扩展程序是“特殊的”,例如,他们没有通过Runnable方法的View参数。

    onClick
  4. 用法是这样的:

    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();
     }
 })