gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:43:52 26 4
gpt4 key购买 nike

假设我们有一个包含很多 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com