代码之家  ›  专栏  ›  技术社区  ›  mewais

如何从导入Android库的应用程序中配置它?

  •  2
  • mewais  · 技术社区  · 6 年前

    我对Android开发有点陌生,所以我的问题可能很奇怪,甚至不可能。我不知道!

    不管怎样,我正在构建多个应用程序,这些应用程序将有很多共享元素,所以我决定用这些组件构建一个库,并在所有应用程序中使用它,而不是愚蠢地复制和粘贴代码。 例如,库处理欢迎屏幕和登录/注册流活动等。因此,这种方法可能会导致以下问题:

    1. 虽然应用程序的行为是相同的,但我在欢迎屏幕上显示的徽标是不同的。现在我用库资源(R类)中的图像资源填充它,这对于所有应用程序都是相同的,显然是不正确的。
    2. 登录/注册过程基于FireBase,这将要求应用程序具有能够使用它们的密钥。现在,我还用库资源中的一个虚拟字符串资源填充它。

    所以我的问题可以归结为三个部分:

    1. 我是否可以将此信息从应用程序传递到库?我可以修改图书馆的R类吗?或者我可以从库中使用应用程序的R类吗?我也可以将库的这一部分称为传递所需参数的函数。但第一个解决方案对我来说可能更干净?
    2. 不管问题1的答案是什么。我在哪里做这个,怎么做?图书馆有欢迎活动本身,这应该是应用程序中的第一个活动。一旦应用程序启动,在第一个活动开始之前,我该如何以及在何处执行此操作?
    3. 如果我所做的是错误的或不可能的,有没有其他方法来实现它?
    2 回复  |  直到 6 年前
        1
  •  2
  •   ישו אוהב אותך Mahavir    6 年前
    1. 我是否可以将此信息从应用程序传递到库? 我可以修改图书馆的R类吗?或者我可以用 程序库中的R类?我也可以称之为 库作为函数传递我需要的参数。但第一 解决方案对我来说可能更干净?

    您不需要修改R类,因为您可以通过创建同名文件来重写资源文件。但这不是一个干净的解决方案,因为您需要不断地确保您的项目和库资源名称是相同的。

    1. 不管问题1的答案是什么。我在哪里做这个,怎么做?这个 图书馆有欢迎活动本身,应该是 应用程序中的第一个活动。一旦这个应用程序出现,我该怎么做?在哪里做? 在第一个活动开始之前开始?

    与其重写资源名称,不如修改您的库以接收作为使用库合同的配置。这里是示例:

    弗斯特 ,创建用于保存配置的类:

    public class Configuration {
      private int welcomeImageDrawableId;
      private int logoDrawableId;
    
      // constructor
      public Configuration(int welcomeImageDrawableId, int logoDrawableId) {
        this.welcomeImageDrawableId = welcomeImageDrawableId;
        this.logoDrawableId = logoDrawableId;
      }
    
      // setter and getter.
      public int getLogoDrawableId() {
        return logoDrawableId;
      }
    }
    

    第二 ,通过创建 Singleton 将由库内部使用的类:

    public class MyLibrary {
        private static MyLibrary myLibrary;
        private Configuration configuration;
    
        private MyLibrary(){}
        private MyLibrary(Configuration configuration) {
          this.configuration = configuration;
        }
    
        public static MyLibrary getInstance() {
            if(myLibrary == null) {
                throw new RuntimeException("Need call createInstanceWith method first!!");
            }
            return myLibrary;
        }
    
        public static MyLibrary createInstanceWith(Configuration configuration) {
            if(myLibrary == null) {
                synchronized(MyLibrary.class) {
                    if (myLibrary == null) {
                      myLibrary = new MyLibrary(configuration);
                    }
                }
            }
            return test;
        }
    
        public Configuration getConfiguration() {
          return configuration;
        }
    }
    

    第三 ,通过singleton类使用库中的配置类。像这样:

    // assume imvLogo is an existing ImageView
    Configuration configuration = MyLibrary.getInstance().getConfiguration();
    imvLogo.setImageResource(configuration.getLogoDrawableId());
    

    最后 ,在使用库时注册合同:

    Configuration configuration = new Configuration(R.drawable.welcome, R.drawable.logo);
    MyLibrary.createInstanceWith(configuration);
    

    注: 所有的代码还没有测试,应该是错误的。

        2
  •  0
  •   mewais    6 年前

    除了上面的解决方案,我还找到了另一种方法来实现这一点,而不必初始化库和其他什么。 我认为正确的方法是在库中使用productFlavors。这允许库共享一组主要的源代码、一组主要的资源,然后为每个应用程序/风格共享一组额外的资源。这对我来说已经足够了。

    有关构建变体和口味的详细信息: https://developer.android.com/studio/build/build-variants