web-dev-qa-db-fra.com

Android utilisant les variantes de Gradle Build dans le code comme un if

J'essaie de travailler avec des saveurs de construction. Dans mon build.gradle, j'ai défini 2 versions, une version normale et une version administrateur.

En gros, le type d’administrateur a un bouton supplémentaire sur l’activité principale.

Je comprends que je peux définir différents packages/classes pour différentes saveurs. Mais existe-t-il un moyen de créer une sorte de cas si d'ajouter/supprimer un morceau de code en fonction de la saveur?

En gros, il me faudrait deux versions d’une activité. Mais je ne veux pas deux versions différentes de l'activité et les maintenir. 

Donc, dans mon activité, j'aimerais faire

=> gradle vérifie si saveur est 'admin' => si oui ajoutez ce code du bouton

est-ce possible? Ou auriez-vous besoin de deux activités physiques différentes et maintenez-vous donc les deux lorsque vous ajoutez des fonctionnalités par la suite.

40
Stephan Celis

BuildConfig.FLAVOR vous donne la saveur combinée du produit . Donc, si vous n'avez qu'une seule dimension de saveur:

productFlavors {
    normal {
    }

    admin {
    }
}

Ensuite, vous pouvez simplement le vérifier:

if (BuildConfig.FLAVOR.equals("admin")) {
    ...
}

Mais si vous avez plusieurs dimensions de saveur:

flavorDimensions "access", "color"

productFlavors {
    normal {
        dimension "access"
    }

    admin {
        dimension "access"
    }

    red {
        dimension "color"
    }

    blue {
        dimension "color"
    }
}

il existe également des champs BuildConfig.FLAVOR_access et BuildConfig.FLAVOR_color, vous devriez donc le vérifier comme suit:

if (BuildConfig.FLAVOR_access.equals("admin")) {
    ...
}

Et BuildConfig.FLAVOR contient le nom complet de la saveur. Par exemple, adminBlue.

80
mixel

Pour éviter une chaîne simple dans la condition, vous pouvez définir une propriété booléenne:

productFlavors {
    normal {
        flavorDimension "access"
        buildConfigField 'boolean', 'IS_ADMIN', 'false'
    }

    admin {
        flavorDimension "access"
        buildConfigField 'boolean', 'IS_ADMIN', 'true'
    }
}

Ensuite, vous pouvez l'utiliser comme ceci:

if (BuildConfig.IS_ADMIN) {
    ...
}
47
user2878850

Vous pouvez définir différents champs de configuration de construction ou différentes valeurs de ressources (telles que des valeurs de chaîne) par type, par exemple. (selon les astuces et les recettes de Google ), par exemple, 

Android {
  ...
  buildTypes {
    release {
      // These values are defined only for the release build, which
      // is typically used for full builds and continuous builds.
      buildConfigField("String", "BUILD_TIME", "\"${minutesSinceEpoch}\"")
      resValue("string", "build_time", "${minutesSinceEpoch}")
      ...
    }
    debug {
      // Use static values for incremental builds to ensure that
      // resource files and BuildConfig aren't rebuilt with each run.
      // If they were dynamic, they would prevent certain benefits of
      // Instant Run as well as Gradle UP-TO-DATE checks.
      buildConfigField("String", "BUILD_TIME", "\"0\"")
      resValue("string", "build_time", "0")
    }
  }
}

Donc, dans ce cas, quelque chose comme

productFlavors {
    normal {
        dimension "access"
        buildConfigField("boolean", "IS_ADMIN", "false")
    }

    admin {
        dimension "access"
        buildConfigField("boolean", "IS_ADMIN", "true")
    }
}

et ensuite l'utiliser comme 

if (BuildConfig.IS_ADMIN) {
    ...
} else {
    ...
}

ou s'il ne s'agit que d'avoir différentes valeurs de chaîne pour différents goûts, vous pouvez le faire avec différents resValues et vous n'avez même pas besoin du if/then

0
auspicious99