当前位置: 首页 > 面试题库 >

在Android中实现View.OnClickListener的最佳方法

齐典
2023-03-14
问题内容

假设我们有一个活动,该活动有很多视图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内部创建一个私有类,并让该内部类实现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.OnClickListenerActivity接口是必经之路。正如Android强烈建议一遍又一遍的实现接口,无论它是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
    }
}

PS:您的方法肯定会增加代码行:P;)



 类似资料:
  • 问题内容: 我打算通过此库在android中实现Socket.io,用于基于聊天的应用程序。据我了解,该图书馆似乎还不错。我想知道如何始终保持整个应用程序中的 单个 套接字连接吗?在这里,我列出了实现的方法,其中我需要最好和稳定的方法。 三种方式 MainApplication 类扩展 应用程序 这样,我们就可以在 主线程 (或应用程序的生命周期)中维护套接字连接,并且只要活动需要套接字实例,我们

  • 目标:在OpenCL中实现下面所示的图表。OpenCl内核需要做的主要工作是将系数数组和临时数组相乘,然后在最后将所有这些值累加为一。(这可能是时间最密集的操作,并行性在这里非常有用)。 我正在为执行乘法和加法的内核使用一个辅助函数(我希望这个函数也是并行的)。 图片描述: 每次一个值被传递到与系数数组大小相同的数组(临时数组)中。现在,每次一个值被传递到这个数组中,临时数组都会并行地与系数数组相

  • 我有一个相同错误的崩溃报告,就像这个问题中的一样:同一线程上的WebView方法错误 建议创建Runnable()。 我不明白为什么这能解决问题。该错误表示相同线程上的Webview方法,但答案建议在UI-Thread(主线程)上创建该方法。但是UI-Thread不是唯一的线程吗?有人能详细解释整个过程吗(考虑到我在构造函数的每个活动中创建了一个新的Webview)? 实现Javascript函数

  • 问题内容: 我正在尝试编写工厂模式以在程序中创建MainMode或TestMode。我以前用来创建这些对象的代码是: 我的游戏(游戏)将根据布尔值(isMode)创建MainMode对象或TestMode对象。如您所见,我正在向我的TestMode对象(randNo())添加一个额外的值。在TestMode中使用此值,以允许用户输入自己的“随机数”,而在MainMode构造函数中,则是随机生成的。

  • 问题内容: 我们如何确定用于集合的方法的最佳实现(假设equals方法已被正确覆盖)? 问题答案: 最好的实现?这是一个难题,因为它取决于使用模式。 在几乎所有情况下,Josh Bloch的 有效Java项目8(第二版)中都提出了合理的良好实现。最好的办法是在那里查找,因为作者在那里解释了为什么这种方法很好。 简短版 1. 创建一个并分配一个非零值。 对于在方法中测试的每个字段 f,通过以下equ

  • 本文向大家介绍Android中new Notification创建实例的最佳方法,包括了Android中new Notification创建实例的最佳方法的使用技巧和注意事项,需要的朋友参考一下 目前 Android 已经不推荐使用下列方式创建 Notification实例: 最好采用下列方式: 以上所述是小编给大家介绍的Android中new Notification创建实例的最佳方法,希望对大