java - Android onClickListener 实现最佳实践

标签 java android event-handling

有四种方法可以将 onClickListener 添加到可点击的 View (例如按钮):

  1. 在布局文件中设置onClick属性,指向activity中的一个方法,
  2. 创建一个匿名内部类,
  3. 将 onClickListener 分配给私有(private)成员变量。
  4. 让 Activity 上下文实现 onClickListener 接口(interface)。

所以我的问题是,您如何选择这些实现技术中的一种而不是另一种?是否有根据特定条件的最佳实践,或者这只是程序员偏好的问题?

最佳答案

这里我们使用所谓的回调模式。

public class Button {
    private Callback callback;

    public Button(Callback callback) {
        this.callback = callback;
    }

    public void update() {
        // Check if clicked..
        callback.onClick(this);
    }

    public interface Callback {
        public void onClick(Button Button);
    }
}


Button b = new Button(new Callback() {
    @Override
    public void onClick(Button b) {
        System.out.println("Clicked");
    }
});

在我们的例子中,onClick 处理程序实现了接口(interface) View.OnClickListener。

要点:

  • 与 Activity/fragment 的一致性;
  • 访问 Activity/fragment 的成员;
  • 可读性;
  • @Michael Krause 展示了关于 memory leaks 的另一个优点;

1) XML 文件中的属性只能用于 Activity,正如 @Karakuri 提到的,它使用的是反射,速度很慢。

2) 匿名内部类对访问封闭类的成员有特殊的规则(检查 [1] , [2] )。在某些情况下可能会发生内存泄漏(例如使用 AsyncTask、处理程序的线程)。

3) 在这里您可以完全访问封闭类的成员。

4) 是 3d 的变体。

可读性取决于您的处理程序大小,小逻辑可以内联,但对于较大的代码块,请考虑 3d 和 4th。

关于java - Android onClickListener 实现最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37014156/

相关文章:

java - 如何使用 Struts 2 打印 List<Object[]>?

java - 配置 bazel 使用特定 JVM 版本构建/测试

android - 使用 ViewPager 更改选项卡时重新创建 fragment

安卓裁剪 Activity

嵌套 'finally' block 中的 Java 'try' 子句

Java 堆内存使用波动

java - Android 菜单在操作栏中只有 2 项

javascript - 哪个版本的 IE 不将事件作为参数传递给监听器?

javascript - 函数调用困惑的事件处理

javascript - 用于响应平移/缩放的范围更新的 Flot 事件