如何在不重复代码的情况下在多个片段中处理相同的onClick操作?

时间:2015-06-26 20:19:14

标签: android android-fragments onclick android-arrayadapter

我为第一个大型项目做出了贡献,并且正在努力做出设计决策。我有两个片段填充ListView并设置自定义ArrayAdapter。让我们说列表项是电子邮件,两个片段是MessageListFragment和SearchMessagesFragment。 ArrayAdapter使用ViewHolder模式来膨胀每条消息,并将onClickListener附加到" star"图标。

现在,无论我在哪个片段,我都希望onClickListener执行相同的基本操作:将服务器上的电子邮件状态更改为"已加星标,"并确定电子邮件是否需要在列表中移动其位置(例如,如果没有过滤器则单独留下,如果电子邮件按星号消息排序则移至顶部/底部;如果过滤器仅为非过滤器,则从当前列表中删除加星标的邮件)。

如何以可重用的方式创建此行为,以便我不必在两个片段中重复此代码?

3 个答案:

答案 0 :(得分:1)

一种方法是创建一个单独的类,它实现 View.OnClickListener ,然后将该类的实例传递给 setOnClickListener(...)方法

答案 1 :(得分:1)

如果我理解你需要执行由其中一个片段或两者或其他片段触发的动作,你应该创建一个接口,即:

interface MyCustomAction {
  void triggerAction(boolean isTriggered);
}

将其分配给片段并在负责片段的活动中实施

在片段中声明操作:

private MyCustomAction myCustomAction;

通过片段中的Activity分配方法:

public void assignAction(MyCustomAction myCustomAction) {
    this.myCustomAction = myCustomAction;
}

在Fragment中,当调用onClickListner()时,请执行以下操作:

myCustomAction.triggerAction(true); //or False or what you want...

...并在活动中:

myFragment.assignAction(new MyCustomAction() {
    @Override
    public void triggerAction(boolean isTriggered) {
        //Doing something can be triggered by any Fragments using the same Interface
    });

答案 2 :(得分:0)

我不完全确定我完全理解你,你是说你有两个onClickListeners并且你希望他们在没有重复代码的情况下做同样的事情吗?如果是这样,您可以简单地将重复的代码放在子例程中并从两个侦听器中调用它。但是,如果您的意思是您有一个onClickListener并且希望它监听两个不同的操作,那么您可以更改这些操作,以便它们作用于同一个侦听器。我不确定你使用的语言是什么,所以我不能告诉你如何做到这一点,但它应该相当简单。