【问题标题】:Android Modular ProgrammingAndroid 模块化编程
【发布时间】:2016-06-23 18:21:30
【问题描述】:

我的问题可能无效。我在这里提到的观点可能有点不正确,因为我既不完美也不专家。

我有一个购物应用程序,我想开始构建一个模块化应用程序。就像我想在应用程序中添加附属用户(添加某些功能或这将在应用程序中显示一些额外页面的模块)。

类似的情况发生在框架中:我们添加并启用某个模块,然后框架根据需要加载所有内容。

为此,我想要以下更改:

  1. 在 NavigationView 中添加一个显示“附属标签”的条目。
  2. 加载片段(只需为导航视图中的一个标签/选项添加一个片段)。

假设我有一个包含片段和所有相关代码的库项目。

我怎样才能自动构建应用程序,比如在 XML 的某处写“true”?

此处自动表示添加标签,点击标签等时执行 Intents。

<Modules>
<enable>true/false</enable>
</Modules>

这只是简单的场景。

【问题讨论】:

    标签: android modular


    【解决方案1】:

    您可以通过多种可能的方式做到这一点(就像编写代码的任何地方一样)。

    1. “文件”方式: 使用键值对创建一个名为 modules.txt 的新文件。加载文件并检查模块是否启用。
    2. “恒定”方式: 创建一个只包含描述模块的公共静态最终变量的抽象类。
    3. “包管理器”方式: 见create Android Application plugins/extensions (apk)
    4. “多”apk方式: 请注意,不建议这样做!

    我们鼓励您开发和发布单个 APK

    multiple apk support

    【讨论】:

      【解决方案2】:

      要添加到 codewing 的答案,您还可以使用 Gradle 的资源管理功能来完成此操作,因此您只需在一个地方查看启用/禁用状态。

      为此,您有 2 个可靠的选择。

      第一个以布尔值开头,可以按风味进行拆分:

      <bool name="module_x_enabled">true</bool>
      

      第二种方法是在 Gradle 合并资源后将您的值注入到 String 资源中,方法是将类似这样的内容添加到您的 build.gradle 文件中,然后比较启用的值:

      <string name="module_x_enabled">MODULE_X_ENABLED_PLACEHOLDER</string>
      
      
      android.applicationVariants.all{ variant ->
          variant.mergeResources.doLast{    
              replaceInValues(variant, 'MODULE_X_ENABLED_PLACEHOLDER', MODULE_X_ENABLED)
          }
      }
      
      def replaceInValues(variant, fromString, toString) {
          File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml")
          String content = valuesFile.getText('UTF-8')
          content = content.replaceAll(fromString, toString)
          valuesFile.write(content, 'UTF-8')
      }
      

      MODULE_X_ENABLED 将是您的 gradle.properties 文件中的设置,例如:

      MODULE_X_ENABLED=true 
      

      编辑:或者更好,

      为什么不从某种服务器中提取设置,这样您就不需要重新构建和重新启动来更新客户端的模块?

      【讨论】:

      • 对不起@Guardanis,我对仅更改字符串和 gradle 相关的过程不太了解。因为我是 android 技术的新手。我将尝试获取更多相关信息,以便我了解内容的全部内容。
      • 请指导我应该参考的东西(了解gradle过程等)或者请解释一下。
      • 您使用的是 Gradle/Android Studio 还是您的问题是针对其他构建系统?
      • 是的,我的问题是针对 Gradle/Android Studio。但我不明白更改字符串如何使一切正常。
      • 我想我明白你现在在说什么了。但问题是:不管它是什么,你仍然必须告诉系统你的模块。即使您使用的是 List 或类似的东西,您仍然必须将模块添加到该列表中才能使它们工作(这是 codewing 和我的回答更多的内容;确定是否应该添加模块您是否已经实现到该列表中)。 AFAIK 没有办法只添加一个库并让它自动实现,即使已经实现了类似的模块。
      猜你喜欢
      • 2015-11-02
      • 2010-10-26
      • 1970-01-01
      • 2012-01-23
      • 2011-07-23
      • 2012-07-29
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多