目的:
我正在寻找一种将功能附加到按钮的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);
    

    10-06 07:29