Bagaimana Anda bisa mendapatkan nomor Versi Manifes dari variabel XML (Layout) App?

184

Saya ingin memiliki cara untuk referensi nomor versi manifes proyek di bagian utama kode. Apa yang telah saya lakukan sampai sekarang adalah menautkan nomor versi dalam file XML String ke manifes (@ string / Versi). Yang ingin saya lakukan adalah melakukannya sebaliknya, menautkan variabel XML string ke versi dalam manifes. Alasannya? Saya hanya ingin mengubah nomor versi di satu lokasi, file manifes. Apakah ada cara untuk melakukan ini? Terima kasih!

PearsonArtPhoto
sumber
17
Ini BUKAN duplikat. Pertanyaan yang dimaksud menanyakan bagaimana melakukan hal yang sama dalam CODE, saya bertanya dalam XML. Dua konstruksi yang sangat berbeda dalam pemrograman Android ...
PearsonArtPhoto

Jawaban:

367

Saya yakin itu sudah dijawab di sini .

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

ATAU

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
Konstantin Burov
sumber
8
Hampir, tetapi tidak cukup ... Yang ingin saya lakukan adalah
merujuknya
Terima kasih banyak!!! Saya telah mencari kemana-mana untuk ini:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Aaron Klap
1
@ Syuh saya tidak berpikir begitu.
Konstantin Burov
3
Tambahkan BuildConfig.VERSION_NAME ke jawaban Anda untuk lelucon gradle.
jobbert
102

Tidak ada cara untuk mengeluarkan versi secara langsung, tetapi ada dua solusi yang bisa dilakukan.

  1. Versi dapat disimpan dalam string sumber daya, dan ditempatkan ke manifes dengan:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
  2. Seseorang dapat membuat tampilan khusus, dan menempatkannya ke dalam XML. Tampilan akan menggunakan ini untuk menetapkan nama:

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

Salah satu dari solusi ini akan memungkinkan untuk menempatkan nama versi dalam XML. Sayangnya tidak ada solusi sederhana yang bagus, seperti android.R.string.versionatau sesuatu seperti itu.

PearsonArtPhoto
sumber
14
sebuah catatan kecil untuk 1: ini bekerja tetapi saya pikir itu tidak dianjurkan karena saya mendapat peringatan yang memberi tahu sayaThe android:versionName cannot be a resource url, it must be a literal string
Griddo
1
Apa yang saya lakukan adalah membiarkan nama versi manifes tidak tersentuh (tetapi perbarui setiap kali rilis baru) dan gunakan string.xml untuk menyimpan nilai yang akan saya gunakan di seluruh aplikasi.
numediaweb
1
Sebab AndroidStudio, manifes versionNameditimpa oleh satu set dalam build.gradlefile
Adrian C.
66

Anda dapat menggunakan versionNamesumber XML, seperti tata letak aktivitas. Pertama-tama buat sumber string di app/build.gradledengan potongan berikut di androidnode:

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

Jadi seluruh build.gradleisi file dapat terlihat seperti ini:

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'
}

Kemudian Anda bisa menggunakannya @string/versionNamedalam XML. Android Studio akan menandainya merah, tetapi aplikasi akan dikompilasi tanpa masalah. Misalnya, ini dapat digunakan seperti ini di 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>
Arun Shankar
sumber
3
@DenisGL michiganlabs.com/…
Arun Shankar
3
Ini lebih baik, daripada gaya programatik.
Neurotransmitter
2
Solusi luar biasa. Terima kasih banyak.
Samik Bandyopadhyay
2
Saya menggunakan yang terbaru dan masih berfungsi untuk saya. Saya menggunakan ini dan beberapa variabel lain seperti ini. @ k2col kesalahan apa yang Anda dapatkan saat mengkompilasi? Tolong posting kode gradle
Arun Shankar
3
Ini harus dianggap sebagai jawaban terbaik.
pepan
15

Saya memecahkan masalah ini dengan memperluas kelas Preferensi.

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

Kemudian dalam XML preferensi saya:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>
daratan laut
sumber
Ups. Saya pasti berpikir Preferensi XML berdasarkan komentar lain.
seastland
Namun demikian, saya tetap akan menyalin dan menempelkan jawabannya.
Mathijs Segers
13

Saya menggunakan BuildConfig.VERSION_NAME.toString();. Apa perbedaan antara itu dan mendapatkannya dari PackageManager?

Tidak ada solusi berbasis XML yang berhasil untuk saya, maaf.

Mullazman
sumber
7
BuildConfig.VERSION_NAME sudah berupa string, tidak perlu memanggil toString () di atasnya.
Makotosan
Kebiasaan. Cukup adil
Mullazman
Ada kasus ketika memanggil ini dalam proyek Anda mungkin mendapatkan hasil yang berbeda dari apa yang Anda harapkan. Sebagai contoh jika Anda menggunakan submodule android dalam proyek Anda dan Anda menyebutnya dari kode submodule itu akan referensi untuk membangun konfigurasi submodule yang mungkin memiliki versi yang berbeda. Atau jika Anda menyebutnya dari kode proyek Anda, Anda dapat secara tidak sengaja referensi untuk membangun konfigurasi submodule Anda dan mendapatkan hasil yang sama. Berhati-hatilah dan periksa kembali apakah Anda merujuk ke paket config build yang tepat.
MikeL
Coba gunakan panduan ini: medium.com/@manas/…
CrandellWS
Perbedaannya adalah BuilConfig disediakan oleh Gradle sedangkan mendapatkannya saat runtime adalah oleh PackageManager (OS)
Ishaan Kumar
12

JIKA Anda menggunakan Gradle, Anda dapat menggunakan file build.gradle untuk secara terprogram menambahkan nilai ke sumber daya xml pada waktu kompilasi.

Kode Contoh diambil dari: 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}"
    }
}

sekarang gunakan @string/app_versionsesuai kebutuhan dalam XML

Ini akan menambah .debugnama versi seperti yang dijelaskan dalam artikel yang ditautkan saat dalam mode debug.

CrandellWS
sumber
1
jawaban terbaik !!
Raheel Hasan
2

Anda tidak dapat menggunakannya dari XML.

Anda perlu memperluas widget yang Anda gunakan dalam XML dan menambahkan logika untuk mengatur teks menggunakan apa yang disebutkan pada jawaban Konstantin Burov.

Makarse
sumber
Saya takut itu ... Terima kasih atas bantuannya!
PearsonArtPhoto
2
kita bisa menggunakannya. tolong periksa jawaban saya. Saya menggunakannya di aplikasi saya
Arun Shankar
1

Solusi termudah adalah menggunakan BuildConfig.

Saya menggunakan BuildConfig.VERSION_NAMEaplikasi saya.

Anda juga dapat menggunakan BuildConfig.VERSION_CODEuntuk mendapatkan kode versi.

cHAuHaN
sumber
-3

Terlambat ke gim, tetapi Anda bisa melakukannya tanpa @string/xyzmenggunakan?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"
     />
ddrscott
sumber
11
Saya menggunakan seperti ini :, <Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>tetapi tampilkan sebagai ?16843292. Apa yang salah?
Hebat
Saya tidak yakin tetapi berpikir ini untuk API nanti?
Mafro34
@PearsonArtPhoto sebenarnya, di mana katanya?
Mafro34
tidak bekerja; mengembalikan nomor lucu yang @Suge tunjukkan di atas
pepan
tidak bekerja sama sekali dan mengembalikan nilai acak seperti yang diposting sebelumnya
A_rmas