【问题标题】:correctly making use of inheritance in Android在 Android 中正确使用继承
【发布时间】:2012-01-09 19:38:33
【问题描述】:

我在 3 个列表的顶部有一个 “标题”,其中包含用于编辑列表的简单的 Create Read Update 和 Delete 按钮。

我应该如何对 Header 进行子类化,以便我可以覆盖 TaskHeader、ProjectHeader、ClientsHeader(子类)中的侦听器

布局、按钮创建、分配等都可以在同一个实现中完成,只需将侦听器分配给特定的子类即可。

更新了建议的解决方案

界面

import android.view.View.OnClickListener;

public interface AttachClickListeners {

void attachCreateListener(OnClickListener l);
void attachReadListener(OnClickListener l);
void attachUpdateListener(OnClickListener l);
void attachDeleteListener(OnClickListener l);

}

标题

public class Header extends LinearLayout implements AttachClickListeners {
/* removed for shortness */
public void attachCreateListener(OnClickListener listener) {
    insertBtn.setOnClickListener(listener);
}

public void attachReadListener(OnClickListener listener) {
    selectBtn.setOnClickListener(listener);
}

public void attachUpdateListener(OnClickListener listener) {
    updateBtn.setOnClickListener(listener);
}

public void attachDeleteListener(OnClickListener listener) {
    deleteBtn.setOnClickListener(listener);
}

然后每次创建标头时,我都会按照@elijah 的建议传递一个不同的侦听器对象

【问题讨论】:

    标签: android design-patterns refactoring


    【解决方案1】:

    如果 UI 和行为可以共享,则不必对标头进行子类化。

    相反,为您想要响应的事件的侦听器类创建接口定义。例如,如果您想对 Create 按钮有不同的响应,请定义一个 onCreateClickedListener 接口,然后为共享标头对象所在的每个视图创建该接口的特定实例。您必须注册侦听器;类似:

    createClickedListener = new onCreateClickedListener() {
      @Override
      public void onClick() { ... }
    };
    
    header.setOnCreateClickedListener(createClickedListener);
    

    This 教程深入介绍了该主题。

    【讨论】:

    • 感谢链接很有趣 - 如果我用我的解决方案编辑问题,也许您可​​以解释接口解决方案的优势。我对抽象类做了类似的事情,然后提供了一个抽象方法——getListener(),子类覆盖了它。
    • 我实际上不确定你在这里问什么。如果您编辑问题,我很高兴看到它。接口解决方案的优点是您不必对标头对象进行子类化——如果您查看 Android 框架,那就是“它是如何完成的”......否则我们必须对每个按钮等进行子类化我们希望它做什么。
    • 我已更新问题以说明我想要达到的目标。
    • 好吧,同样,在您的解决方案中,每个标题都需要子类化。相反,将 setupButtons 重构为四个不同的 setOnXClickedListener 函数,它们采用一个遵循 OnXClickedListener 接口的对象。然后,每个单独的视图都可以定义它自己的 OnXClickedListener 对象实例,并使用它们自己的 onClick 实现,并将它们分配给该视图中的 Header 实例。同样,这就是“Android 方式”,虽然它确实需要创建 OnXClickedListeners 的实现,但它避免了您必须一遍又一遍地对整个标头进行子类化。
    • 感谢您澄清这一点,实施后它更有意义,为什么它更可取。
    猜你喜欢
    • 2014-08-15
    • 2016-11-05
    • 2012-06-22
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多