Comment pouvez-vous obtenir le numéro de version de Manifest les variables XML App (mise en page)?

StackOverflow https://stackoverflow.com/questions/4471025

Question

Je voudrais avoir un moyen de référence numéro de version manifeste du projet dans la partie principale du code. Ce que je fais jusqu'à maintenant est de relier le numéro de version dans un fichier XML chaîne au manifeste (@ string / Version). Ce que je voudrais faire est de le faire dans l'autre sens, lier une variable XML de chaîne à la version dans le manifeste. La raison? Je voudrais avoir seulement changer le numéro de version dans un seul endroit, le fichier manifeste. Est-ce qu'il y a un moyen de faire ça? Merci!

Était-ce utile?

La solution 2

Il n'y a pas une façon directement obtenir la version, mais il y a deux contournements qui pourrait être fait.

  1. La version pourrait être stockée dans une chaîne de ressources, et placé 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 placez-le dans le XML. La vue serait l'utiliser pour attribuer le nom:

    context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
    

Chacune de ces solutions permettrait de placer le nom de la version en XML. Malheureusement, il n'y a pas une solution simple agréable, comme android.R.string.version ou quelque chose comme ça.

Autres conseils

Je crois que déjà répondu ici .

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

ou

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

Vous pouvez utiliser la versionName dans les ressources XML, telles que mises en page d'activité. Tout d'abord créer une ressource de chaîne dans la app/build.gradle avec l'extrait suivant dans le nœud android:

applicationVariants.all { variant ->
    variant.resValue "string", "versionName", variant.versionName
}

l'ensemble le contenu du fichier 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 fichier XML. Android Studio marquer rouge, mais l'application va compiler sans problèmes. Par exemple, cela 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>

Je résolu ce problème en étendant 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);
        }
    }
}

Alors 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 du PackageManager?

Aucune solution XML à base ont travaillé pour moi, désolé.

Si vous utilisez Gradle vous pouvez utiliser le fichier build.gradle pour ajouter la valeur aux programme ressources XML au moment de la compilation.

Exemple de code extrait de: https://medium.com / @ manas / gérer-votre-android-app-s-codeVersion-VersionName-avec-gradle-7f9c5dcf09bf

buildTypes {
    debug {
        versionNameSuffix ".debug"
        resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
    }
    release {
        resValue "string", "app_version", "${defaultConfig.versionName}"
    }
}

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 de mettre le texte en utilisant ce qui est mentionné sur la réponse de Konstantin Burov.

solution simple consiste à utiliser BuildConfig.

J'utilise BuildConfig.VERSION_NAME dans ma demande.

Vous pouvez également utiliser BuildConfig.VERSION_CODE pour obtenir le code de version.

Fin du 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"
     />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top