Come ottenere il numero di versione manifest dalle variabili XML (layout) dell'app?


184

Vorrei avere un modo per fare riferimento al numero di versione manifest del progetto nella parte principale del codice. Quello che ho fatto finora è stato quello di collegare il numero di versione in un file XML String al manifest (@ string / Version). Quello che vorrei fare è farlo al contrario, collegare una variabile XML stringa alla versione nel manifest. La ragione? Vorrei solo cambiare il numero di versione in una posizione, il file manifest. C'è un modo per fare questo? Grazie!


17
Questo NON è un duplicato. La domanda in questione chiede come fare la stessa cosa in CODICE, lo sto chiedendo in XML. Due costrutti molto diversi nella programmazione Android ...
PearsonArtPhoto

Risposte:


367

Credo che abbia già ricevuto risposta qui .

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

O

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

8
Quasi, ma non del tutto ... Quello che mi piacerebbe fare è fare riferimento a un codice XML, ma sembra che potrebbe non essere possibile, quindi ...
PearsonArtPhoto

Grazie mille!!! Ho cercato dappertutto questo:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Aaron Klap,

1
@Shubh Non la penso così.
Konstantin Burov,

3
Aggiungi BuildConfig.VERSION_NAME alla tua risposta per i fumi di livello.
jobbert,

102

Non esiste un modo per ottenere direttamente la versione, ma ci sono due soluzioni alternative che potrebbero essere fatte.

  1. La versione può essere archiviata in una stringa di risorse e inserita nel manifest tramite:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
  2. Si potrebbe creare una vista personalizzata e inserirla nell'XML. La vista userebbe questo per assegnare il nome:

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

Entrambe queste soluzioni consentirebbero di posizionare il nome della versione in XML. Sfortunatamente non esiste una soluzione semplice, simile android.R.string.versiono simile.


14
una piccola nota all'1 .: funziona ma penso che sia scoraggiato da quando ricevo un avvertimento che mi diceThe android:versionName cannot be a resource url, it must be a literal string
Griddo,

1
Quello che ho fatto è di lasciare intatto il nome della versione manifest (ma aggiornarlo ogni volta che viene rilasciata una nuova versione) e usare string.xml per memorizzare il valore che userò attraverso l'app.
numediaweb,

1
Perché AndroidStudioil manifest versionNameè ignorato da quello impostato nel build.gradlefile
Adrian C.

67

È possibile utilizzare le versionNamerisorse in XML, come i layout delle attività. Innanzitutto creare una risorsa stringa nel app/build.gradlecon il seguente frammento nel androidnodo:

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

Quindi l'intero build.gradlecontenuto del file potrebbe apparire così:

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/versionNamein XML. Android Studio lo contrassegnerà in rosso, ma l'app verrà compilata senza problemi. Ad esempio, questo può essere usato in questo modo 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>


3
Questo è meglio dello stile programmatico.
Neurotrasmettitore

2
Soluzione meravigliosa Grazie mille.
Samik Bandyopadhyay,

2
Sto usando l'ultimo e funziona ancora per me. Uso questa e molte altre variabili come questa. @ k2col che errore ricevi durante la compilazione? Per favore inserisci il tuo codice di voto
Arun Shankar il

3
Questa dovrebbe essere considerata la migliore risposta.
pepan,

15

Ho risolto questo problema estendendo la classe Preferenza.

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);
        }
    }
}

Quindi nelle mie preferenze XML:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>

Ops. Devo aver pensato a Preferenza XML basato su un altro commento.
Seastland

Tuttavia, copierò e incollerò comunque la sua risposta.
Mathijs Segers,

13

Io uso BuildConfig.VERSION_NAME.toString();. Qual è la differenza tra questo e ottenerlo dal packageManager?

Mi dispiace, nessuna soluzione basata su XML ha funzionato per me.


7
BuildConfig.VERSION_NAME è già una stringa, non è necessario chiamare toString () su di essa.
Makotosan,

Abitudine. Abbastanza giusto
Mullazman,

Ci sono casi in cui chiamare questo nel tuo progetto può ottenere risultati diversi da quello che ti aspetteresti. Ad esempio, se usi un sottomodulo Android nel tuo progetto e lo chiami dal codice del sottomodulo, farà riferimento per creare la configurazione del sottomodulo che potrebbe avere una versione diversa. Oppure, se lo chiami dal codice del tuo progetto, puoi fare riferimento per errore per creare la configurazione del tuo sottomodulo e ottenere lo stesso risultato. Fai solo attenzione e ricontrolla che fai riferimento a un pacchetto adeguato della configurazione di configurazione.
MikeL,

Prova a utilizzare questa guida: medium.com/@manas/…
CrandellWS,

differenza è BuilConfig è fornito da Gradle mentre ottenerlo in fase di esecuzione è da PackageManager (OS)
Ishaan Kumar

12

Se stai usando Gradle puoi usare il file build.gradle per aggiungere a livello di codice valore alle risorse xml al momento della compilazione.

Codice di esempio estratto da: https://medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf

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

ora usa @string/app_versioncome necessario in XML

Si aggiungerà .debugal nome della versione come descritto nell'articolo collegato in modalità debug.


1
la migliore risposta di sempre !!
Raheel Hasan,

2

Non puoi usarlo dall'XML.

Devi estendere il widget che stai usando nell'XML e aggiungere la logica per impostare il testo usando quanto menzionato nella risposta di Konstantin Burov.


Ne avevo paura ... Grazie per l'aiuto!
PearsonArtPhoto,

2
possiamo usarlo. per favore controlla la mia risposta. Lo sto usando nella mia app
Arun Shankar

1

La soluzione più semplice è usare BuildConfig.

Uso BuildConfig.VERSION_NAMEnella mia applicazione.

Puoi anche usare BuildConfig.VERSION_CODEper ottenere il codice della versione.


-3

In ritardo al gioco, ma puoi farlo senza @string/xyzusare?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
Uso in questo modo :, <Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>ma mostra come. ?16843292Cosa c'è che non va?
Suge,

Non sono sicuro ma pensi che sia per le API successive?
Mafro34,

@PearsonArtPhoto in realtà, dove lo dice?
Mafro34,

non funziona; restituisce un numero divertente che @Suge ha sottolineato sopra
pepan

non funziona affatto e restituisce un valore casuale come precedentemente pubblicato
A_rmas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.