是否有在单个活动中处理多个片段的 Android 设计模式?

Posted

技术标签:

【中文标题】是否有在单个活动中处理多个片段的 Android 设计模式?【英文标题】:Is there an Android design pattern to handle multiple fragments in a single activity? 【发布时间】:2016-08-19 18:23:58 【问题描述】:

我在工作中继承了一些代码,我对一些实现有疑问。我正在处理的应用程序有一个包含大约 15 个不同片段的 Activity。 Activity中处理这些片段的逻辑大致可以总结为如下伪代码:

if (button_1 selected)  
    load fragment_1; 
 else if (button_2 selected) 
    load fragment_2;
 else if (button_3 selected) 
    load fragment_3;
 ...and so on x15ish

我的问题是:是否存在某种 android 设计模式来处理此类情况?代码有效;但是,我对巨大的 if/else 或 case 语句不太满意。我看到了这个question,它似乎与我遇到的问题非常相似。我在互联网上进行了大量搜索,但没有找到此类场景的示例或最佳实践。

如果有人能指出我正确的方向或有一些建议;那太棒了。谢谢!

【问题讨论】:

你检查过这个developer.android.com/intl/zh-cn/training/basics/fragments/… 吗? 您通常没有 if-else 链,通常您使用选项卡更改片段或每个片段的 onClick 方法 @KhizarHayat,是的,我已经完成了相当一部分阅读片段的工作,并且在很多项目中都使用了它。但是,在这种情况下,我从未真正看到过这么多片段包含在单个活动中并在 if/else 语句中实现。 @Nanoc,为简单起见,我对实现进行了伪编码;但是每个按钮都有一个 onClick 方法,该方法通向 if/else 链来确定要加载的片段。我应该提到的一个额外细节是每个片段都是全屏的,它替换了容器 Activity 中的容器 FrameLayout。 您已决定如何解决您的问题? 【参考方案1】:

对于布局中的每个按钮,您可以在 Activity 中分配一个方法:

<Button 
    ...
    android:onClick="startFragmentOne" />

然后实现这些方法:

public void startFragmentOne(View view) 
    //TODO

【讨论】:

【参考方案2】:

您不应检查已选择的按钮,而应使用按钮的 onClickListener 来选择正确的片段。

buttonForFragment1.setOnClickListener(new View.OnClickListener() 
    public void onClick(View v) 
             // select fragment 1 here
    
);

关于这个问题,这不是设计模式的级别,而是实现细节(习语),您正确地将您的代码识别为异味,我认为一个可能的解决方案不符合条件作为模式是上面的代码。

【讨论】:

以上是关于是否有在单个活动中处理多个片段的 Android 设计模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理单个活动的多个片段

多项活动中的暗模式

使用单个片段显示UI而不是活动是一种好习惯吗?

从单个按钮从多个片段中提取数据

在 Android 中使用具有多个布局的单个片段

如何在 FAB 按钮单击时将数据从多个片段发送到单个活动