web-dev-qa-db-fra.com

Comment obtenir le numéro de version du manifeste à partir des variables XML de l'application (mise en page)?

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!

176
PearsonArtPhoto

Il n'y a pas moyen de sortir directement la version, mais deux solutions de contournement sont possibles.

  1. 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">
    
  2. 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.

98
PearsonArtPhoto

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;
361
Konstantin Burov

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>
60
Arun Shankar

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>
15
seastland

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é.

10
Mullazman

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.

6
CrandellWS

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.

2
Macarse

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.

0
cHAuHaN