如何从其他构建flavor导入一个类

时间:2017-01-05 11:07:16

标签: android android-studio android-gradle build.gradle android-build-flavors

我的项目结构如下所示

+ src
        + main // this is my common code
            + java 
                - LoginScreen // depending on condition launch screen from flavor1 or flavor2 
            + res
        + flavor1
            + java
            + res
        + flavor2
            + java
            + res

我在 main / src 中有Login类,具体取决于条件,必须从flavor1或flavor2启动屏幕。

例如:

class LoginScreen{
......

    if(true){
        // launch ScreenUser from Flavor1 reset of screen flows from falvour1
    }else{
       // launch ScreenOTP from Flavor2 reset of screen flows from falvour2
    }
}

在这种情况下,如果我为flavor1进行构建,则会显示falvor2类的错误,反之亦然。

两种口味都有不同的applicationId,如 applicationIdSuffix“.flavor1”

这可能吗?如果不是我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:3)

当我完成这类事情时,我使用了接口和依赖注入(我使用dagger)。类似的东西:

public interface LoginBehaviour {

    void goToNextScreen(Context context);
}

然后在每个flavor中定义一个实现,其中包含启动下一个屏幕的代码。类似的东西:

public class FlavourOneLoginBehaviour implements LoginBehaviour {

    @Override
    public void goToNextScreen(Context context) {
        context.startActivity(new Intent(context, ScreenUser.class));
    }

}

public class FlavourTwoLoginBehaviour implements LoginBehaviour {

    @Override
    public void goToNextScreen(Context context) {
        context.startActivity(new Intent(context, ScreenOTP.class));
    }

}

您需要在每个flavor中设置依赖注入容器,以便它引用本地实现(这将根据您使用的框架而有所不同)。完成之后,您可以使用主项目中的容器在运行时获取LoginBehaviour接口的正确实现,并且可以在其上调用goToNextScreen来进行导航。依赖注入是一种非常方便的方法,可以确保您可以在不进行重大重构的情况下交换部分代码,并且可以在重用和灵活性方面提供很多帮助。希望有所帮助!

答案 1 :(得分:1)

执行此操作的可能性之一,如果您只想使用if检查buildType / productFlavor的类,则可以在buildTypes / productFlavors中设置BuildConfig字段的值添加:

productFlavors {
  flavor1 {
    buildConfigField "String", "BUILD_FLAVOR", "Flavor1"
  }
  flavor2 {
    buildConfigField "String", "BUILD_FLAVOR", "Flavor2"
  }
}

然后你可以在代码中使用它:

class LoginScreen {
......

  switch(BuildConfig.BUILD_FLAVOR) {
    case "Flavor1":
      // launch ScreenUser from Flavor1
      break;
    case "Flavor2":
      // launch ScreenOTP from Flavor2
      break;
  }
}

希望,我帮了。祝你好运!