Bagaimana Anda bisa mendapatkan nomor Versi Manifes dari variabel XML (Tata Letak) Aplikasi?

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


person PearsonArtPhoto    schedule 17.12.2010    source sumber
comment
Ini BUKAN duplikat. Pertanyaan yang dimaksud menanyakan bagaimana melakukan hal yang sama di CODE, saya bertanya dalam XML. Dua konstruksi yang sangat berbeda dalam pemrograman Android...   -  person PearsonArtPhoto    schedule 12.01.2013


Jawaban (9)


Saya yakin hal itu sudah dijawab di sini.

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

OR

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
person Konstantin Burov    schedule 17.12.2010
comment
Hampir, tapi belum sepenuhnya... Yang ingin saya lakukan adalah mereferensikannya ke kode XML, tapi sepertinya itu tidak bisa dilakukan, jadi... - person PearsonArtPhoto; 17.12.2010
comment
Terima kasih banyak!!! Saya telah mencari kemana-mana untuk ini: String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; - person Aaron Klap; 12.07.2012
comment
@Shubh Saya rasa tidak. - person Konstantin Burov; 19.07.2013
comment
Tambahkan BuildConfig.VERSION_NAME ke jawaban Anda untuk gradle fokes. - person jobbert; 10.11.2016

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

  1. Versi tersebut dapat disimpan dalam string sumber daya, dan ditempatkan ke dalam 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 memungkinkan penempatan nama versi dalam XML. Sayangnya tidak ada solusi sederhana yang bagus, seperti android.R.string.version atau semacamnya.

person PearsonArtPhoto    schedule 09.12.2012
comment
catatan kecil untuk 1.: ini berfungsi tetapi menurut saya tidak disarankan karena saya mendapat peringatan yang memberi tahu saya The android:versionName cannot be a resource url, it must be a literal string - person Griddo; 23.04.2013
comment
Apa yang saya lakukan adalah membiarkan nama versi manifes tidak tersentuh (tetapi memperbaruinya setiap kali ada rilis baru) dan menggunakan string.xml untuk menyimpan nilai yang akan saya gunakan di seluruh aplikasi. - person numediaweb; 17.09.2013
comment
Untuk AndroidStudio, manifes versionName ditimpa oleh manifes yang diatur dalam file build.gradle - person Adrian C.; 22.03.2016

Anda dapat menggunakan versionName di sumber daya XML, seperti tata letak aktivitas. Pertama buat sumber daya string di app/build.gradle dengan cuplikan berikut di node android:

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

Jadi seluruh isi file build.gradle mungkin 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 menggunakan @string/versionName di XML. Android Studio akan menandainya dengan warna 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>
person Arun Shankar    schedule 07.04.2016
comment
Bisakah Anda menjelaskan keajaiban (atau ketidaktahuan Gradle saya ;-) di balik garis ini? - person DenisGL; 06.05.2016
comment
@DenisGL michiganlabs.com/ - person Arun Shankar; 06.05.2016
comment
Ini lebih baik daripada gaya terprogram. - person Neurotransmitter; 11.05.2016
comment
Solusi luar biasa. Terima kasih banyak. - person Samik Bandyopadhyay; 07.08.2016
comment
Saat saya menggunakan string ini dalam tata letak, saya mendapat peringatan dari Android Studio: Tidak dapat menyelesaikan sumber daya @string/version_name. Adakah yang tahu bagaimana cara menghilangkannya? - person DenisGL; 05.11.2016
comment
@DenisGL sudahkah Anda menambahkan variant.resValue "string", "versionName", variant.versionName di build.gradle ? - person Arun Shankar; 06.11.2016
comment
ini sepertinya jawaban yang bagus ketika saya membacanya tetapi sayangnya tidak berhasil, setidaknya tidak di Android Studio terbaru. - person k2col; 23.11.2016
comment
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 kompilasi? Tolong posting kode gradle Anda - person Arun Shankar; 23.11.2016
comment
Ini harus dianggap sebagai jawaban terbaik. - person pepan; 04.04.2017
comment
Berhasil tetapi menunjukkan tanda merah|| kesalahan dalam xml meskipun berjalan - person A_rmas; 04.04.2017
comment
@A_rmas kesalahan apa yang muncul saat Anda mengarahkan kursor ke sorotan merah? - person Arun Shankar; 04.04.2017
comment
@ArunElectra tidak dapat menyelesaikan simbol. tapi itu memungkinkan menjalankan dan menghasilkan apk. itu hanyalah tanda kesalahan. - person A_rmas; 13.04.2017
comment
Tidak berhasil untuk saya. Mencoba menggunakannya di TextView saya tetapi dikatakan Tidak ada sumber daya yang cocok dengan nama yang diberikan (di 'teks' dengan nilai '@string/versionName'). - person Patrick; 25.08.2017
comment
ini solusi terbaik, dengan solusi ini kami dapat menampilkan versi berbeda untuk varian berbeda - person Koorosh Ghorbani; 21.12.2018
comment
Wow, solusi yang bagus!!! Satu-satunya hal buruknya adalah AndroidStudio menganggap string itu tidak dikenali, tetapi apk dihasilkan sebagaimana mestinya! - person Andris; 05.12.2019

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 di XML preferensi saya:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>
person seastland    schedule 23.11.2013
comment
Ups. Saya pasti memikirkan Preferensi XML berdasarkan komentar lain. - person seastland; 24.11.2013
comment
Meskipun demikian, saya hanya akan menyalin dan menempelkan jawabannya. - person Mathijs Segers; 11.06.2015

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

Contoh Kode 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_version sesuai kebutuhan dalam XML

Ini akan menambahkan .debug ke nama versi seperti yang dijelaskan dalam artikel tertaut ketika dalam mode debug.

person CrandellWS    schedule 19.08.2018
comment
jawaban terbaik yang pernah ada!! - person Raheel Hasan; 14.01.2019

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

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

person Mullazman    schedule 08.01.2016
comment
BuildConfig.VERSION_NAME sudah berupa string, tidak perlu memanggil toString() di dalamnya. - person Makotosan; 04.04.2016
comment
Kebiasaan. Cukup adil - person Mullazman; 06.04.2016
comment
Ada kalanya memanggil ini dalam proyek Anda mungkin mendapatkan hasil yang berbeda dari yang Anda harapkan. Misalnya jika Anda menggunakan submodul Android di proyek Anda dan memanggilnya dari kode submodul, itu akan merujuk ke konfigurasi build submodul yang mungkin memiliki versi berbeda. Atau jika Anda memanggilnya dari kode proyek Anda, Anda mungkin secara tidak sengaja merujuknya untuk membuat konfigurasi submodul Anda dan mendapatkan hasil yang sama. Berhati-hatilah dan periksa kembali apakah Anda merujuk ke paket konfigurasi build yang tepat. - person MikeL; 05.10.2016
comment
Coba gunakan panduan ini: medium. com/@manas/ - person CrandellWS; 19.08.2018
comment
perbedaannya adalah BuilConfig disediakan oleh Gradle sedangkan mendapatkannya saat runtime adalah dengan PackageManager (OS) - person Ishaan Kumar; 24.01.2020

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.

person Macarse    schedule 17.12.2010
comment
Saya takut akan hal itu... Terima kasih atas bantuannya! - person PearsonArtPhoto; 18.12.2010
comment
kita bisa menggunakannya. tolong periksa jawaban saya. Saya menggunakannya di aplikasi saya - person Arun Shankar; 07.04.2016

Solusi termudah adalah dengan menggunakan BuildConfig.

Saya menggunakan BuildConfig.VERSION_NAME di aplikasi saya.

Anda juga dapat menggunakan BuildConfig.VERSION_CODE untuk mendapatkan kode versi.

person cHAuHaN    schedule 23.06.2019

Terlambat ke permainan, tetapi Anda dapat melakukannya tanpa @string/xyz dengan menggunakan ?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"
     />
person ddrscott    schedule 09.09.2013
comment
Saya menggunakan seperti ini:<Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>, tetapi ditampilkan sebagai ?16843292.Ada apa? - person Suge; 26.09.2013
comment
Saya tidak yakin tetapi menurut Anda ini untuk API selanjutnya? - person Mafro34; 10.12.2013
comment
@PearsonArtPhoto sebenarnya, di mana dikatakan demikian? - person Mafro34; 15.12.2013
comment
tidak berfungsi; mengembalikan nomor lucu yang ditunjukkan @Suge di atas - person pepan; 04.04.2017
comment
tidak berfungsi sama sekali dan mengembalikan nilai acak seperti yang diposting sebelumnya - person A_rmas; 04.04.2017
comment
seperti yang dicatat dan ditautkan Ini adalah Nilai Konstan 16843292 (0x0101021c) oleh karena itu mengapa @suge mendapatkan nilai spesifik itu - person CrandellWS; 19.08.2018