【问题标题】:Android design/architecture: Create different Apps from same code baseAndroid 设计/架构:从相同的代码库创建不同的应用程序
【发布时间】:2015-05-29 16:14:31
【问题描述】:

我想从相同的代码库创建两个应用程序。它们的颜色不同,一些数据来自后端。情况就像,假设我想创建应用程序 App1 和 App2。两者都有相似的流程。我可以吗,

  1. 如果是 App1,请选择标题颜色蓝色,其他颜色选择红色?
  2. 在代码中,if(running App == App1) { 执行此部分} else {其他 部分}?
  3. 如果 App 是 App1,则选择 layout1.xml 进行活动,否则选择 layout2.xml?

我不知道该怎么做。任何帮助都会很棒。

谢谢。

【问题讨论】:

标签: android architecture mobile-application application-design


【解决方案1】:

如果您使用的是 Android Studio,那么您所描述的是产品风格。引用the documentation:

产品风格定义了项目构建的应用程序的自定义版本。单个项目可以有不同的风格,这些风格会改变生成的应用程序。

为了回答这个问题,让我们假设您有一个具有两种产品风格的项目,flavorOneflavorTwo。您的项目还将具有三个源集:

  • src/main/,你的大部分东西都放在那里
  • src/flavorOne/,一种口味的东西去哪里
  • src/flavorTwo/,另一种口味的东西去哪里了

考虑到这一点...

如果是App1,选择一个标题颜色蓝色,其他选择红色?

src/main/res/values/colors.xml 中,定义一个名为header 的颜色,并给它一个蓝色值。在src/flavorTwo/res/values/colors.xml 中,定义一个名为header 的颜色,并赋予它一个红色值。应用程序的其余部分指的是header 颜色(例如,@color/headerR.color.header)。当您构建flavorOne 时,将使用main 颜色。当您构建 flavorTwo 时,flavorTwo 值将覆盖 main 值。

如果 App 是 App1,则为活动选择 layout1.xml,否则选择 layout2.xml?

src/main/res/layout/thingy.xml 中,定义您的默认布局实现。在src/flavorTwo/res/layout/thingy.xml 中,定义要用于flavorTwo 的布局。您的 Java 代码将引用 R.layout.thingy。当您构建flavorOne 时,将使用main 布局。当您构建 flavorTwo 时,flavorTwo 布局将覆盖 main 布局。

在代码中,if(running App == App1) { execute this part} else {other part}?

这在一定程度上取决于您拥有多少不同的代码。

如果是实质性的,你可以使用策略模式:

  • src/flavorOne/java/ 中实现StuffStrategy

  • src/flavorTwo/java/ 中有另一个StuffStrategy 实现

  • 在您的 src/main/java 代码中,引用 StuffStrategy,它将根据您正在构建的风格引入正确的实现

如果代码变化非常小,您可以使用buildConfigField 为要添加到BuildConfig 类的一些新字段(例如STUFF)提供一个值,该值会因风格而异。 This Stack Overflow answer 显示详细信息。

【讨论】:

  • 要在Play Store上上传这些应用,我们需要有不同的包,那么我们可以将这两种风格作为两个不同的应用上传吗?
  • @Sagar:当然。这就是重点。产品风格为您的分发策略建模,您希望分发 N 个不同的应用程序,这些应用程序逻辑上都是相同的应用程序,只有微小的变化。
  • 如何在运行时为应用选择不同的布局?
  • @RohitShinde:我不明白你的问题,抱歉。您可能希望提出一个单独的 Stack Overflow 问题,在那里您可以详细解释您的担忧。
  • @CommonsWare 如果我有两种不同风格的应用程序,那么它们也会有不同的活动布局。那么,我是否在 Activity 的 onCreate 方法中指定要膨胀的布局?如果是这样,我怎么知道我运行的是哪种风格的应用程序?
【解决方案2】:

如果您使用 Android Studio,那么我会提到另一种可能性。对于主要功能,您可以创建一个库项目作为两个应用程序的基础(将其检查为库项目,并将其作为库包含到两个单独的项目中),然后扩展您希望以不同方式结束的活动、类行为。

例如(简单的一个),如果您有两个具有不同初始布局的应用程序,比如说splash.xml,您可以在库项目中创建这个默认的一个,并在另一个布局文件夹中创建一个具有相同名称的不同的应用程序项目的资源目录。第二个项目将使用它自己的布局文件夹中的那个。

我会推荐带有风味的 Android Studio 和 Gradle,如 @CommonsWare 的回答,但如果你不使用它,你也可以这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多