草庐IT

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

coder 2023-12-12 原文

目标: 我正在寻找一种将功能附加到按钮的 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 - 将功能动态附加到 Button 的 onclicklistener Android的更多相关文章

  1. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  2. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  5. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  6. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  7. ruby-on-rails - carrierwave:在序列化动态属性上安装 uploader - 2

    首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟

  8. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

  9. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  10. ruby - 动态方法链? - 2

    如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210

随机推荐