Wie können Sie die Manifest-Versionsnummer aus der App bekommen (Layout) von XML-Variablen?
-
11-10-2019 - |
Frage
Ich mag einen Weg, um das Projektes manifest Versionsnummer im Hauptteil des Codes zu verweisen. Was habe ich bisher gemacht ist die Versionsnummer in einer String XML-Datei auf das Manifest zu verknüpfen (@ String / Version). Was würde Ich mag zu tun ist, es in die andere Richtung zu tun, um einen Zeichenfolge XML-Variable auf die Version im Manifest verknüpfen. Der Grund? Ich möchte nur haben, um die Versionsnummer in einem Ort zu ändern, die Manifest-Datei. Gibt es eine Möglichkeit, dies zu tun? Dank!
Lösung 2
Es gibt keine Möglichkeit, direkt die Version raus, aber es gibt zwei Workarounds, die getan werden könnte.
-
Die Version in einer Ressourcenzeichenfolge gespeichert werden könnte, und in die manifeste gestellt von:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.somepackage" android:versionName="@string/version" android:versionCode="20">
-
Man könnte eine benutzerdefinierte Ansicht erstellen und sie in die XML platzieren. Die Ansicht verwenden würde dies den Namen zuweisen:
context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
Jede dieser Lösungen für die Platzierung der Versionsnamen in XML erlauben würde. Leider gibt es keine schöne einfache Lösung, wie android.R.string.version
oder so ähnlich.
Andere Tipps
Sie können die versionName
in XML-Ressourcen verwenden, wie Aktivität Layouts. Erstellen Sie zunächst eine Zeichenfolge-Ressource in der app/build.gradle
mit dem folgenden Ausschnitt in dem android
Knoten:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
Also die ganze build.gradle
Dateiinhalte wie folgt aussehen:
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'
}
Dann können Sie @string/versionName
im XML verwenden. Android Studio wird markieren Sie es rot, aber die App ohne Probleme kompilieren. Zum Beispiel kann dies wie dies in app/src/main/res/xml/preferences.xml
verwendet werden:
<?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>
Ich löste dieses Problem, indem Sie die Preference-Klasse erweitern.
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);
}
}
}
Dann in meinen Vorlieben XML:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>
Ich verwende BuildConfig.VERSION_NAME.toString();
. Was ist der Unterschied zwischen dem, und aus dem Paketmanager zu bekommen?
Keine XML-basierte Lösungen haben für mich gearbeitet, sorry.
Wenn Sie Gradle verwenden, können Sie die build.gradle Datei verwenden, um programm Wert auf die zum Zeitpunkt der Kompilierung xml Ressourcen hinzuzufügen.
Beispiel-Code extrahiert aus: https://medium.com / @ Manas / manage-your-android-App-s-version-Version-mit-gradle-7f9c5dcf09bf
buildTypes {
debug {
versionNameSuffix ".debug"
resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
}
release {
resValue "string", "app_version", "${defaultConfig.versionName}"
}
}
Jetzt Verwendung @string/app_version
wie in XML erforderlich
Es wird wie beschrieben in dem verlinkten Artikel, wenn im Debug-Modus .debug
auf die Versionsnamen hinzuzufügen.
Sie können es nicht aus der XML verwenden.
Sie müssen das erweitern Widget Sie in der XML verwenden und die Logik hinzufügen, um den Text zu setzen mit, was auf Konstantin Burov Antwort erwähnt wird.
Die einfachste Lösung ist die Verwendung BuildConfig
.
Ich benutze BuildConfig.VERSION_NAME
in meiner Anwendung.
Sie können auch BuildConfig.VERSION_CODE
verwenden Versionscode zu erhalten.
Späte, um das Spiel, aber man kann es ohne @string/xyz
tun, indem Sie ?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"
/>