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!

War es hilfreich?

Lösung 2

Es gibt keine Möglichkeit, direkt die Version raus, aber es gibt zwei Workarounds, die getan werden könnte.

  1. 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">
    
  2. 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

Ich glaube, dass schon beantwortet wurde hier .

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

oder

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

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"
     />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top