Comment pouvez-vous obtenir le numéro de version de Manifest les variables XML App (mise en page)?
-
11-10-2019 - |
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!
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.
-
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">
-
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"
/>