Je voudrais avoir un moyen de faire référence au numéro de version du manifeste du projet dans la partie principale du code. Ce que je faisais jusqu'à maintenant, c'est de lier le numéro de version d'un fichier XML String au manifeste (@ string/Version). Ce que je voudrais faire, c'est l'inverse: lier une variable chaîne XML à la version du manifeste. La raison? J'aimerais seulement changer le numéro de version en un seul endroit, le fichier manifeste. Est-ce qu'il y a un moyen de faire ça? Merci!
Il n'y a pas moyen de sortir directement la version, mais deux solutions de contournement sont possibles.
La version peut être stockée dans une chaîne de ressource et placée dans le manifeste par:
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.somepackage"
Android:versionName="@string/version" Android:versionCode="20">
On pourrait créer une vue personnalisée et la placer dans le XML. La vue utiliserait ceci pour assigner le nom:
context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
L'une ou l'autre de ces solutions permettrait de placer le nom de la version en XML. Malheureusement, il n’existe pas de solution simple et agréable, comme Android.R.string.version
ou quelque chose du genre.
Je crois que cela a déjà été répondu ici .
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
OR
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
Vous pouvez utiliser le versionName
dans les ressources XML, telles que les présentations d'activité. Commencez par créer une ressource chaîne dans le app/build.gradle
avec l'extrait suivant dans le noeud Android
:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
Ainsi, le contenu du fichier entier build.gradle
peut ressembler à ceci:
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 23
buildToolsVersion '24.0.0 rc3'
defaultConfig {
applicationId 'com.example.myapplication'
minSdkVersion 15
targetSdkVersion 23
versionCode 17
versionName '0.2.3'
jackOptions {
enabled true
}
}
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.3.0'
compile 'com.Android.support:design:23.3.0'
compile 'com.Android.support:support-v4:23.3.0'
}
Ensuite, vous pouvez utiliser @string/versionName
dans le XML. Android Studio le marque en rouge, mais l'application se compilera sans problème. Par exemple, ceci peut être utilisé comme ceci dans app/src/main/res/xml/preferences.xml
:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
<PreferenceCategory
Android:title="About"
Android:key="pref_key_about">
<Preference
Android:key="pref_about_build"
Android:title="Build version"
Android:summary="@string/versionName" />
</PreferenceCategory>
</PreferenceScreen>
J'ai résolu ce problème en élargissant la classe de préférence.
package com.example.Android;
import Android.content.Context;
import Android.preference.Preference;
import Android.util.AttributeSet;
public class VersionPreference extends Preference {
public VersionPreference(Context context, AttributeSet attrs) {
super(context, attrs);
String versionName;
final PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
try {
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
versionName = null;
}
setSummary(versionName);
}
}
}
Puis dans mes préférences XML:
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
<com.example.Android.VersionPreference Android:title="Version" />
</PreferenceScreen>
J'utilise BuildConfig.VERSION_NAME.toString();
. Quelle est la différence entre cela et l'obtenir auprès de packageManager?
Aucune solution basée sur XML n'a fonctionné pour moi, désolé.
SI vous utilisez Gradle, vous pouvez utiliser le fichier build.gradle pour ajouter de la valeur par programme aux ressources xml au moment de la compilation.
Exemple de code extrait de: https://medium.com/@manas/manage-your-Android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf
buildTypes {
debug {
versionNameSuffix ".debug"
resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
}
release {
resValue "string", "app_version", "${defaultConfig.versionName}"
}
}
maintenant, utilisez @string/app_version
au besoin en XML
Il ajoutera .debug
au nom de la version, comme décrit dans l'article lié en mode débogage.
Vous ne pouvez pas l'utiliser à partir du XML.
Vous devez étendre le widget que vous utilisez dans le fichier XML et ajouter la logique pour définir le texte en utilisant ce qui est mentionné dans la réponse de Konstantin Burov.
La solution la plus simple consiste à utiliser BuildConfig
.
J'utilise BuildConfig.VERSION_NAME
dans mon application.
Vous pouvez également utiliser BuildConfig.VERSION_CODE
pour obtenir le code de version.