java - 在 Android 中实现 View.OnClickListener 的最佳方式

标签 java android listener onclicklistener implements

假设我们有一个包含很多 View 的 Activity,OnClickListener 要在其上注册。

最常见的实现方式是让 Activity-Subclass 实现 OnClickListener,如下所示:

public class ActivityMain extends Activity implements View.OnClickListener
{   
    @Override
    public void onClick(View view)
    {
        switch (view.getId())
        {
            //handle multiple view click events
        }
    }
}

我喜欢实现它的方式是在 Activity-Subclass 中创建一个私有(private)类,并让该内部类实现 OnClickListener:

public class ActivityMain extends Activity implements View.OnClickListener
{
    private class ClickListener implements View.OnClickListener
    {   
        @Override
        public void onClick(View view)
        {
            switch (view.getId())
            {
                //handle multiple view click events
            }
        }
    }
}

这样代码看起来更有条理,也更容易维护。

此外,谈到“Is-a”、“Has-a”关系,后者似乎是一个很好的做法,因为现在 Activity-Subclass 将与 ClickListener 具有“Has-a”关系。 而在前一种方法中,我们会说我们的 Activity-Subclass “Is-a” ClickListener,这并不完全正确。

请注意,我不关心后者会导致的内存开销。

另外,在xml中添加onClick标签是完全没有问题的。

那么,真正实现 ClickListener 的最佳方式是什么?

请不要推荐任何库,如 RoboGuice 或 ButterKnife 等。

更新:

我想分享一下我最终采用的方法。

我直接在Activity/Fragment中实现监听器。

就 OOP 设计而言。 “HAS-A” 方法没有提供任何实际好处,甚至会占用更多内存。考虑到我们将为我们实现的每个类似监听器创建的嵌套类的数量(以及内存开销),显然应该避免这种方法。

最佳答案

首先,Android 没有定义关于注册点击监听器的最佳实践。这完全取决于您的用例。

实现 View.OnClickListener 接口(interface)到 Activity 是要走的路。由于 Android 强烈建议接口(interface)实现一遍又一遍,无论是 Activity 还是 Fragment。

现在就像你描述的那样:

public class ActivityMain extends Activity implements View.OnClickListener
{
    private class ClickListener implements View.OnClickListener
    {   
        @Override
        public void onClick(View view)
        {
            switch (view.getId())
            {
                //handle multiple view click events
            }
        }
    }
}

这是你的方法。现在这是您的实现方式,如果您不关心内存开销,这没有任何问题。但是,如果您可以在主类中简单地实现它,那么创建内部类并实现 View.OnClickListener 有什么好处,这也可以导致您需要的代码清晰和简单。

所以这只是一个讨论,而不是获得实现 View.OnClickListener 的最佳解决方案,因为如果您遵循每个人的实际观点,您将寻求一个简单且内存高效的解决方案.

所以我更喜欢传统的方式。它使事情变得简单而高效。检查下面的代码:

@Override
public void onClick(View view)
{
    switch (view.getId())
    {
        //handle multiple view click events
    }
}

P.S : 你的方法肯定会增加代码行数 :P ;)

关于java - 在 Android 中实现 View.OnClickListener 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082892/

相关文章:

java - 有时 showDialog 不起作用

android - 如何通过单击搜索 View 栏打开新 Activity ?

google-maps - 确定 Google Maps API 中 Geojson 的绘制何时完成

java - 如何在不同的类中使用 Action 监听器?

java - 反序列化后 HashMap 变慢 - 为什么?

java - 如何获取 Spring MVC 中路径剩余部分的路径变量?

java - 如何自动将用户定义的对象存储到 map 中?

java - 尝试插入方法时出现多键错误

android - 从android中的 fragment 管理工具栏的导航和后退按钮

JAVA、SWT 在封闭范围内定义的局部变量必须是最终的或有效最终的