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!

È stato utile?

Soluzione 2

Non c'è un modo per ottenere direttamente la versione fuori, ma ci sono due modi di aggirare che si potrebbero fare.

  1. 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">
    
  2. 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"
     />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top