Come si può ottenere il numero di versione Manifest da (layout) variabili XML della App?
-
11-10-2019 - |
Domanda
Mi piacerebbe avere un modo per fare riferimento il numero di versione manifesta del progetto nella parte principale del codice. Quello che ho fatto fino ad ora è quello di collegare il numero di versione in un file XML String al manifesto (@ string / Version). Quello che vorrei fare è di farlo il contrario, collegare una variabile stringa XML per la versione nel manifesto. La ragione? Mi piacerebbe avere solo cambiare il numero di versione in un unico luogo, il file manifesto. C'è un modo per fare questo? Grazie!
Soluzione 2
Non c'è un modo per ottenere direttamente la versione fuori, ma ci sono due modi di aggirare che si potrebbero fare.
-
La versione potrebbe essere memorizzato in una stringa di risorsa, e inserito nel manifesto:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.somepackage" android:versionName="@string/version" android:versionCode="20">
-
Si potrebbe creare una visualizzazione personalizzata, e posizionarlo in XML. La vista avrebbe usato questo per assegnare il nome:
context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
Una di queste soluzioni permetterebbe per posizionare il nome della versione in XML. Purtroppo non c'è una soluzione piacevole semplice, come android.R.string.version
o qualcosa del genere.
Altri suggerimenti
Credo che già risposto qui .
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
o
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
È possibile utilizzare la versionName
di risorse XML, come ad esempio i layout di attività. In primo luogo creare una risorsa stringa nel app/build.gradle
con il seguente frammento nel nodo android
:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
Quindi, l'intero contenuto del file build.gradle
può apparire come segue:
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'
}
Quindi è possibile utilizzare @string/versionName
in XML. Android Studio segnerà di rosso, ma l'applicazione verrà compilato senza problemi. Ad esempio, questo può essere utilizzato come questo in 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>
ho risolto questo problema estendendo la classe Business.
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);
}
}
}
Poi nel mio preferenze XML:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>
Io uso BuildConfig.VERSION_NAME.toString();
. Qual è la differenza tra questo e ottenerlo dal PackageManager?
Non ci sono soluzioni basate su XML hanno lavorato per me, mi dispiace.
Se si utilizza Gradle è possibile utilizzare il file build.gradle a livello di codice aggiungere valore alle risorse XML in fase di compilazione.
Esempio Codice estratto da: https://medium.com / @ Manas / manage-tuo-android-app-s-versionCode-VersionName-con-Gradle-7f9c5dcf09bf
buildTypes {
debug {
versionNameSuffix ".debug"
resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
}
release {
resValue "string", "app_version", "${defaultConfig.versionName}"
}
}
ora uso @string/app_version
come necessario in XML
Si aggiungerà .debug
per il nome della versione come descritto in questo articolo collegato in modalità di debug.
Non è possibile utilizzare dal XML.
È necessario estendere il widget che si sta utilizzando in XML e aggiungere la logica per impostare il testo utilizzando ciò che è indicato sulla risposta di Konstantin Burov.
soluzione più semplice è quella di utilizzare BuildConfig
.
Io uso BuildConfig.VERSION_NAME
nella mia applicazione.
È inoltre possibile utilizzare BuildConfig.VERSION_CODE
per ottenere il codice di versione.
in ritardo al gioco, ma è possibile farlo senza @string/xyz
utilizzando ?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"
/>