如何在导入Android库的应用程序中配置该库?

4

我对Android开发比较新,所以我的问题可能很奇怪甚至不可能。我不知道!

无论如何,我正在构建多个应用程序,它们将具有许多共享元素,因此我决定使用这些组件构建库,并在所有应用程序中使用它,而不是愚蠢地复制和粘贴代码。 例如,该库处理欢迎屏幕和登录/注册流程活动等内容。以下是此方法可能引起的问题:

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

所以我的问题实际上可以分为3个部分:

  1. 是否有任何方式可以从应用程序传递此信息到库?我是否可以修改库的R类?或者我可以从库中使用应用程序的R类?我也可以调用库的这一部分作为函数传递我需要的参数。但第一个解决方案可能更加清晰?
  2. 无论Q1的答案是什么。我在哪里以及如何做到这一点?库本身具有欢迎活动,这应该是应用程序中的第一个活动。当应用程序启动并在第一个活动开始之前,我应该如何做到这一点?
  3. 如果我的做法是错误的或不可能的,是否有其他方法可以实现它?

如果涉及到View类,你可以使用自定义属性。如果不是,只需将它们作为某个函数的参数传递即可。 - Toris
它们不是视图,而是完整的活动。但这正是我的问题,如果我要传递一些参数给一个处理显示活动的函数,我该如何在应用程序启动时首先执行此操作?这些活动是应用程序中首次显示的。 - mewais
Intent可以携带额外的数据。如果该活动是从某个活动调用的,请使用它。如果不是,则表示它只是从启动器中调用的,在该活动中编写自定义内容。 - Toris
请在此页面中搜索 putExtra()。Intent https://developer.android.com/reference/android/content/Intent#public-methods 和 Guide https://developer.android.com/guide/components/intents-filters#Building - Toris
这是我在if not...部分编写的一个案例。一个常见的解决方案是显示选项屏幕并让用户选择选项。有很多实现方法。而且,你的问题似乎太宽泛了。按照StackOverflow的风格,问题应该具体针对一个问题。 - Toris
显示剩余3条评论
2个回答

2
  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;
  }
}

第二步,使用配置类为库创建一个单例类,该类将被库内部使用:


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;
    }
}

第三步,通过单例类使用您库中的配置类。例如:

singletonClass.使用配置类();

将Original Answer翻译为“最初的回答”。

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

Last, 当使用该库时,请注册合同:

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

注意:所有代码尚未测试,可能会出现错误。

原始答案翻译成中文为“最初的回答”。


0
除了上面的解决方案,我还发现另一种方法可以实现这个整体而无需初始化库等等。我认为正确的做法是在库中使用productFlavors。这允许库共享一个主要的源代码集、一个主要的资源集,然后每个应用程序/口味额外的资源集。这非常适合我的目的。
有关构建变体和口味的更多信息: https://developer.android.com/studio/build/build-variants

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接