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