如何在不重复代码的情况下在多个片段中处理相同的 onClick 操作?
How can the same onClick action be handled in multiple fragments without duplicating code?
我正在为我的第一个大型项目做贡献,并且正在为设计决策而苦苦挣扎。我有两个片段填充一个 ListView 并设置一个自定义 ArrayAdapter。假设列表项是电子邮件,两个片段是 MessageListFragment 和 SearchMessagesFragment。 ArrayAdapter 使用 ViewHolder 模式来填充每条消息并将 onClickListener 附加到 "star" 图标。
现在,无论我在哪个片段中,我都希望 onClickListener 执行相同的基本操作:将服务器上电子邮件的状态更改为 "starred," 并确定电子邮件是否需要移动其位置在列表中(即,如果没有过滤器,则单独保留;如果电子邮件按加星标的消息排序,则将其移至 top/bottom;如果过滤器仅是未加星标的消息,则将其从当前列表中删除)。
如何以可重用的方式创建此行为,以便我不必在两个片段中重复此代码?
一种方法是创建一个单独的 class,实现 View.OnClickListener,然后将 class 的实例传递给setOnClickListener(...) 方法。
我不太确定我完全理解你,你是说你有两个 onClickListeners 并且你希望它们做同样的事情而不需要重复代码吗?如果是这样,您可以简单地将重复代码放在一个子例程中,并从两个侦听器中调用它。但是,如果您的意思是您有一个 onClickListener 并且希望它监听两个不同的动作,那么您可以更改这些动作,以便它们作用于同一个侦听器。我不确定你使用的是什么语言,所以我无法告诉你如何做到这一点,但它应该相当简单。
如果我知道您需要执行由一个或两个或更多片段触发的操作,您应该创建一个接口,即:
interface MyCustomAction {
void triggerAction(boolean isTriggered);
}
分配给Fragments并在Activity负责Fragments
中实现
在片段中声明动作:
private MyCustomAction myCustomAction;
在 Fragment:
中公开要由 Activity 分配的方法
public void assignAction(MyCustomAction myCustomAction) {
this.myCustomAction = myCustomAction;
}
在 Fragment 中,当调用 onClickListner() 时,执行以下操作:
myCustomAction.triggerAction(true); //or False or what you want...
...并且在 Activity:
myFragment.assignAction(new MyCustomAction() {
@Override
public void triggerAction(boolean isTriggered) {
//Doing something can be triggered by any Fragments using the same Interface
});
我正在为我的第一个大型项目做贡献,并且正在为设计决策而苦苦挣扎。我有两个片段填充一个 ListView 并设置一个自定义 ArrayAdapter。假设列表项是电子邮件,两个片段是 MessageListFragment 和 SearchMessagesFragment。 ArrayAdapter 使用 ViewHolder 模式来填充每条消息并将 onClickListener 附加到 "star" 图标。
现在,无论我在哪个片段中,我都希望 onClickListener 执行相同的基本操作:将服务器上电子邮件的状态更改为 "starred," 并确定电子邮件是否需要移动其位置在列表中(即,如果没有过滤器,则单独保留;如果电子邮件按加星标的消息排序,则将其移至 top/bottom;如果过滤器仅是未加星标的消息,则将其从当前列表中删除)。
如何以可重用的方式创建此行为,以便我不必在两个片段中重复此代码?
一种方法是创建一个单独的 class,实现 View.OnClickListener,然后将 class 的实例传递给setOnClickListener(...) 方法。
我不太确定我完全理解你,你是说你有两个 onClickListeners 并且你希望它们做同样的事情而不需要重复代码吗?如果是这样,您可以简单地将重复代码放在一个子例程中,并从两个侦听器中调用它。但是,如果您的意思是您有一个 onClickListener 并且希望它监听两个不同的动作,那么您可以更改这些动作,以便它们作用于同一个侦听器。我不确定你使用的是什么语言,所以我无法告诉你如何做到这一点,但它应该相当简单。
如果我知道您需要执行由一个或两个或更多片段触发的操作,您应该创建一个接口,即:
interface MyCustomAction {
void triggerAction(boolean isTriggered);
}
分配给Fragments并在Activity负责Fragments
中实现在片段中声明动作:
private MyCustomAction myCustomAction;
在 Fragment:
中公开要由 Activity 分配的方法public void assignAction(MyCustomAction myCustomAction) {
this.myCustomAction = myCustomAction;
}
在 Fragment 中,当调用 onClickListner() 时,执行以下操作:
myCustomAction.triggerAction(true); //or False or what you want...
...并且在 Activity:
myFragment.assignAction(new MyCustomAction() {
@Override
public void triggerAction(boolean isTriggered) {
//Doing something can be triggered by any Fragments using the same Interface
});