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

Sal*_*lu3 5 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();
        }
    });
Run Code Online (Sandbox Code Playgroud)

我知道我们可以通过调用继承来做到这一点

@Override
public void method(){
    super.method();
    // Do appended stuff
}
Run Code Online (Sandbox Code Playgroud)

或者我们可以内联

new Object(){
    @Override
    public void method(){
        super();
        // Do appended stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过的事情

扩展按钮以包含可运行对象列表.然后设置on click侦听器以触发所有可运行对象.

这样做有不同/更有效的方法吗?

Wil*_*sau 4

由于我们对为什么要这样做的背景了解不多,因此很难确定什么是最好的。如果您想让原始侦听器保持不变/不变,您可以使用装饰器/包装器模式。

维基百科装饰模式

在具体情况下,这意味着,它与您的方法相当Runnable,但您不依赖于另一个接口。一切都通过 来处理View.OnClickListener,它具有以下优点:

  1. 这是一种通用方法,您甚至可以“扩展”您没有源访问权限或不想修改的侦听器。
  2. 您可以在运行时创建扩展行为,并且可以扩展已经实例化的侦听器(与使用继承相反)
  3. 扩展不必知道它们是扩展,它们只是正常的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);
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

用法是这样的:

    DecoratorOnClickListener dl = new DecoratorOnClickListener();

    dl.add(new OriginalOnClickListener());
    dl.add(new ExtensionOnClickListener());

    editText.setOnClickListener(dl);
Run Code Online (Sandbox Code Playgroud)