android - 将功能动态附加到 Button 的 onclicklistener Android

标签 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
    }
}

我尝试过的事情

扩展按钮以包含可运行对象列表。 然后设置点击监听器来触发所有可运行的对象。

是否有不同/更有效的方法来做到这一点?

最佳答案

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

Wikipedia Decorator Pattern

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

  1. 这是一种通用方法,您甚至可以使用它“扩展”您无法访问源代码或不想修改的监听器。
  2. 您可以在运行时创建扩展行为,并且可以扩展已经实例化的监听器(与使用继承相反)
  3. 扩展不必知道它们是扩展,它们只是普通的 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/

相关文章:

Android 共享首选项在删除文件后仍然可见

android - 如何知道特定蓝牙设备何时连接?

java - 用于 Wifi 状态的 Android Monkeyrunner 插件

android - 如何在 RecyclerView 上获得点击(不是 child )

android - 使用其中的 ImageButton 捕获 LinearLayout onClick 事件

android - 解释这个基本的 Kotlin 函数

java - 如何在android中验证警报对话框中的文本框

java - Android中如何让6个按钮调用不同参数的同一个方法?

android - 一次打开一个切换按钮

Javascript 一次 onclick 返回两次结果?