190 votes

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

J'aimerais avoir un moyen de référencer le numéro de version du manifeste du projet dans la partie principale du code. Ce que j'ai fait jusqu'à présent est de lier le numéro de version dans un fichier XML de type String au manifeste (@string/Version). Ce que je voudrais faire, c'est faire l'inverse, c'est-à-dire lier une variable XML string à la version du manifeste. La raison ? J'aimerais n'avoir à modifier le numéro de version qu'à un seul endroit, dans le fichier du manifeste. Existe-t-il un moyen de faire cela ? Merci !

19 votes

Il ne s'agit PAS d'un doublon. La question en question demande comment faire la même chose en CODE, je demande en XML. Deux constructions très différentes dans la programmation Android...

369voto

Konstantin Burov Points 34011

Je crois qu'on a déjà répondu à cette question. aquí .

String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

OU

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;

9 votes

Presque, mais pas tout à fait... Ce que j'aimerais faire, c'est le référencer à un code XML, mais il semble que cela ne soit pas possible, alors...

0 votes

Merci beaucoup ! !! Je l'ai cherché partout : String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

1 votes

@Shubh Je ne pense pas.

104voto

PearsonArtPhoto Points 14639

Il n'existe pas de moyen de diffuser directement la version, mais deux solutions de contournement sont possibles.

  1. La version pourrait être stockée dans une chaîne de ressources, 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 l'utiliserait pour attribuer 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 dans le XML. Malheureusement, il n'y a pas de solution simple et agréable, telle que android.R.string.version ou quelque chose comme ça.

16 votes

Une petite note à 1. : ça marche mais je pense que c'est déconseillé puisque je reçois un avertissement me disant The android:versionName cannot be a resource url, it must be a literal string

1 votes

Ce que j'ai fait, c'est de ne pas toucher au nom de la version du manifeste (mais de le mettre à jour à chaque nouvelle version) et d'utiliser le fichier string.xml pour stocker la valeur que j'utiliserai dans l'application.

1 votes

Pour AndroidStudio le manifeste versionName est remplacée par celle définie dans build.gradle fichier

15voto

seastland Points 71

J'ai résolu ce problème en étendant la classe Preference.

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>

0 votes

Oups. J'ai dû penser à Preference XML en me basant sur un autre commentaire.

0 votes

Néanmoins, je vais copier et coller sa réponse.

3voto

Macarse Points 36519

Vous ne pouvez pas l'utiliser à partir du XML.

Vous devez étendre le widget que vous utilisez dans le XML et ajouter la logique pour définir le texte en utilisant ce qui est mentionné dans la réponse de Konstantin Burov.

0 votes

C'est ce que je craignais... Merci pour votre aide !

2 votes

Nous pouvons l'utiliser. Veuillez vérifier ma réponse. Je l'utilise dans mon application

-1voto

ddrscott Points 125

En retard sur le jeu, mais vous pouvez le faire sans @string/xyz en utilisant ?android:attr

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionName"
     />
    <!-- or -->
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionCode"
     />

11 votes

J'utilise comme ça : <Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference> mais montrer comme ?16843292 Qu'est-ce qui ne va pas ?

0 votes

Je ne suis pas sûr mais je pense que c'est pour les API ultérieures ?

0 votes

@PearsonArtPhoto en fait, où est-ce que ça dit ça ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X