คุณจะรับหมายเลขเวอร์ชัน Manifest จากตัวแปร XML (เค้าโครง) ของแอปได้อย่างไร

ฉันต้องการมีวิธีอ้างอิงหมายเลขเวอร์ชันรายการของโครงการในส่วนหลักของโค้ด สิ่งที่ฉันทำจนถึงตอนนี้คือการเชื่อมโยงหมายเลขเวอร์ชันในไฟล์ String XML ไปยังรายการ (@string/Version) สิ่งที่ฉันต้องการทำคือทำในทางกลับกัน เชื่อมโยงตัวแปร XML สตริงกับเวอร์ชันในรายการ เหตุผล? ฉันต้องการเปลี่ยนหมายเลขเวอร์ชันในตำแหน่งเดียวเท่านั้น นั่นก็คือไฟล์ Manifest มีวิธีการทำเช่นนี้หรือไม่? ขอบคุณ!


person PearsonArtPhoto    schedule 17.12.2010    source แหล่งที่มา
comment
นี่ไม่ใช่สิ่งที่ซ้ำกัน คำถามที่เป็นปัญหาถามว่าจะทำสิ่งเดียวกันใน CODE ได้อย่างไร ฉันกำลังถามในรูปแบบ XML โครงสร้างที่แตกต่างกันสองอย่างในการเขียนโปรแกรม Android ...   -  person PearsonArtPhoto    schedule 12.01.2013


คำตอบ (9)


ฉันเชื่อว่ามีคำตอบแล้วที่นี่

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

OR

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
person Konstantin Burov    schedule 17.12.2010
comment
เกือบแล้ว แต่ยังไม่ใช่... สิ่งที่ผมอยากทำคืออ้างอิงถึงโค้ด XML แต่ดูเหมือนว่าจะเป็นไปไม่ได้ ดังนั้น... - person PearsonArtPhoto; 17.12.2010
comment
ขอบคุณมาก!!! ฉันค้นหาสิ่งนี้มาทุกที่แล้ว: String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; - person Aaron Klap; 12.07.2012
comment
@Shubh ฉันไม่คิดอย่างนั้น - person Konstantin Burov; 19.07.2013
comment
เพิ่ม BuildConfig.VERSION_NAME ให้กับคำตอบของคุณสำหรับการไล่ระดับ fokes - person jobbert; 10.11.2016

ไม่มีวิธีใดที่จะนำเวอร์ชันออกมาโดยตรง แต่มีวิธีแก้ไขสองประการที่สามารถทำได้

  1. เวอร์ชันสามารถจัดเก็บไว้ในสตริงทรัพยากร และวางลงในรายการโดย:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
    
  2. คุณสามารถสร้างมุมมองที่กำหนดเองและวางไว้ใน XML ได้ มุมมองจะใช้สิ่งนี้เพื่อกำหนดชื่อ:

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

โซลูชันอย่างใดอย่างหนึ่งเหล่านี้จะอนุญาตให้วางชื่อเวอร์ชันในรูปแบบ XML น่าเสียดายที่ไม่มีวิธีแก้ปัญหาง่ายๆ ที่ดี เช่น android.R.string.version หรืออะไรทำนองนั้น

person PearsonArtPhoto    schedule 09.12.2012
comment
หมายเหตุเล็กน้อยถึง 1.: มันใช้งานได้ แต่ฉันคิดว่ามันท้อแท้เพราะฉันได้รับคำเตือนบอกฉัน The android:versionName cannot be a resource url, it must be a literal string - person Griddo; 23.04.2013
comment
สิ่งที่ฉันทำคือปล่อยให้ชื่อเวอร์ชันรายการนั้นไม่ถูกแตะต้อง (แต่อัปเดตทุกครั้งที่มีการเปิดตัวใหม่) และใช้ string.xml เพื่อจัดเก็บค่าที่ฉันจะใช้ในแอป - person numediaweb; 17.09.2013
comment
สำหรับ AndroidStudio รายการ versionName จะถูกแทนที่โดยรายการที่อยู่ในไฟล์ build.gradle - person Adrian C.; 22.03.2016

คุณสามารถใช้ versionName ในรีซอร์ส XML เช่น โครงร่างกิจกรรม ขั้นแรกให้สร้างทรัพยากรสตริงใน app/build.gradle โดยมีข้อมูลโค้ดต่อไปนี้ในโหนด android:

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

ดังนั้นเนื้อหาไฟล์ build.gradle ทั้งหมดจึงอาจมีลักษณะดังนี้:

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

จากนั้นคุณสามารถใช้ @string/versionName ใน XML Android Studio จะทำเครื่องหมายเป็นสีแดง แต่แอปจะคอมไพล์โดยไม่มีปัญหา ตัวอย่างเช่น อาจใช้ในลักษณะนี้ใน 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
คุณช่วยอธิบายความมหัศจรรย์ (หรือความไม่รู้ Gradle ของฉัน ;-) ที่อยู่เบื้องหลังบรรทัดเหล่านี้ได้ไหม - person DenisGL; 06.05.2016
comment
@DenisGL michiganlabs.com/ - person Arun Shankar; 06.05.2016
comment
นี่ดีกว่าสไตล์แบบเป็นโปรแกรม - person Neurotransmitter; 11.05.2016
comment
ทางออกที่ยอดเยี่ยม ขอบคุณมากมาย - person Samik Bandyopadhyay; 07.08.2016
comment
เมื่อฉันใช้สตริงนี้ในเค้าโครง ฉันได้รับคำเตือนจาก Android Studio: ไม่สามารถแก้ไขทรัพยากร @string/version_name มีความคิดใดที่จะกำจัดมัน? - person DenisGL; 05.11.2016
comment
@DenisGL คุณเพิ่ม variant.resValue "string", "versionName", variant.versionName ใน build.gradle แล้วหรือยัง? - person Arun Shankar; 06.11.2016
comment
ดูเหมือนเป็นคำตอบที่ดีเมื่อฉันอ่าน แต่น่าเสียดายที่มันใช้งานไม่ได้ อย่างน้อยก็ไม่ใช่ใน Android Studio ล่าสุด - person k2col; 23.11.2016
comment
ฉันใช้เวอร์ชันล่าสุดและยังใช้งานได้สำหรับฉัน ฉันใช้สิ่งนี้และตัวแปรอื่น ๆ อีกหลายตัวเช่นนี้ @ k2col คุณได้รับข้อผิดพลาดอะไรขณะคอมไพล์? กรุณาโพสต์รหัส gradle ของคุณ - person Arun Shankar; 23.11.2016
comment
นี่ควรถือเป็นคำตอบที่ดีที่สุด - person pepan; 04.04.2017
comment
มันใช้งานได้แต่แสดงเครื่องหมายสีแดง|| เกิดข้อผิดพลาดใน xml แม้ว่าจะทำงานอยู่ก็ตาม - person A_rmas; 04.04.2017
comment
@A_rmas ข้อผิดพลาดที่แสดงเมื่อคุณวางเมาส์บนไฮไลต์สีแดงคืออะไร? - person Arun Shankar; 04.04.2017
comment
@ArunElectra ไม่สามารถแก้ไขสัญลักษณ์ได้ แต่อนุญาตให้เรียกใช้และสร้าง apk ได้ มันเป็นเพียงเครื่องหมายของข้อผิดพลาด - person A_rmas; 13.04.2017
comment
ไม่ได้ผลสำหรับฉัน พยายามใช้ใน TextView ของฉัน แต่มันบอกว่าไม่พบทรัพยากรที่ตรงกับชื่อที่กำหนด (ที่ 'ข้อความ' ด้วยค่า '@string/versionName') - person Patrick; 25.08.2017
comment
นี่เป็นทางออกที่ดีที่สุด ด้วยวิธีนี้เราสามารถแสดงเวอร์ชันต่างๆ สำหรับตัวแปรต่างๆ ได้ - person Koorosh Ghorbani; 21.12.2018
comment
ว้าว ทางออกสุดยอด!!! สิ่งเดียวที่แย่ก็คือ AndroidStudio คิดว่าสตริงนั้นไม่ได้รับการยอมรับ แต่ apk สร้างขึ้นตามที่ควรจะเป็น! - person Andris; 05.12.2019

ฉันแก้ไขปัญหานี้โดยขยายคลาสการตั้งค่า

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

จากนั้นใน XML การตั้งค่าของฉัน:

<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
อ๊ะ. ฉันคงคิดถึง Preference XML ตามความคิดเห็นอื่น - person seastland; 24.11.2013
comment
อย่างไรก็ตาม ฉันจะคัดลอกและวางคำตอบของเขาต่อไป - person Mathijs Segers; 11.06.2015

หากคุณใช้ Gradle คุณสามารถใช้ไฟล์ build.gradle เพื่อเพิ่มมูลค่าให้กับทรัพยากร xml โดยทางโปรแกรมในขณะคอมไพล์

โค้ดตัวอย่างที่ดึงมาจาก: 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}"
    }
}

ตอนนี้ใช้ @string/app_version ตามต้องการใน XML

มันจะเพิ่ม .debug ให้กับชื่อเวอร์ชันตามที่อธิบายในบทความที่เชื่อมโยงเมื่ออยู่ในโหมดแก้ไขข้อบกพร่อง

person CrandellWS    schedule 19.08.2018
comment
คำตอบที่ดีที่สุด!! - person Raheel Hasan; 14.01.2019

ฉันใช้ BuildConfig.VERSION_NAME.toString(); อะไรคือความแตกต่างระหว่างสิ่งนั้นกับการได้รับจาก packageManager?

ไม่มีโซลูชันที่ใช้ XML ที่เหมาะกับฉัน ขออภัย

person Mullazman    schedule 08.01.2016
comment
BuildConfig.VERSION_NAME เป็นสตริงอยู่แล้ว ไม่จำเป็นต้องเรียก toString() - person Makotosan; 04.04.2016
comment
นิสัย. ยุติธรรมเพียงพอ - person Mullazman; 06.04.2016
comment
มีหลายกรณีที่การเรียกสิ่งนี้ในโครงการของคุณอาจได้รับผลลัพธ์ที่แตกต่างจากที่คุณคาดหวัง ตัวอย่างเช่น หากคุณใช้โมดูลย่อย android ในโปรเจ็กต์ของคุณและคุณเรียกมันจากโค้ดของโมดูลย่อย มันจะอ้างอิงถึงการกำหนดค่าบิวด์ของโมดูลย่อยซึ่งอาจมีเวอร์ชันที่แตกต่างกัน หรือถ้าคุณเรียกมันจากโค้ดของโปรเจ็กต์ของคุณ คุณอาจอ้างอิงโดยไม่ตั้งใจเพื่อสร้าง config ของโมดูลย่อยของคุณและได้ผลลัพธ์เดียวกัน เพียงใช้ความระมัดระวังและตรวจสอบอีกครั้งว่าคุณอ้างอิงถึงแพ็คเกจที่เหมาะสมของการกำหนดค่าบิลด์ - person MikeL; 05.10.2016
comment
ลองใช้คู่มือนี้: medium com/@มานาส/ - person CrandellWS; 19.08.2018
comment
ความแตกต่างคือ BuilConfig จัดทำโดย Gradle ในขณะที่การรับมันที่รันไทม์นั้นมาจาก PackageManager (OS) - person Ishaan Kumar; 24.01.2020

คุณไม่สามารถใช้มันจาก XML

คุณต้องขยายวิดเจ็ตที่คุณใช้ใน XML และเพิ่มตรรกะเพื่อตั้งค่าข้อความโดยใช้สิ่งที่กล่าวถึงในคำตอบของ Konstantin Burov

person Macarse    schedule 17.12.2010
comment
ฉันกลัวเรื่องนั้น... ขอบคุณสำหรับความช่วยเหลือ! - person PearsonArtPhoto; 18.12.2010
comment
เราสามารถใช้มันได้ โปรดตรวจสอบคำตอบของฉัน ฉันใช้มันในแอพของฉัน - person Arun Shankar; 07.04.2016

วิธีแก้ปัญหาที่ง่ายที่สุดคือใช้ BuildConfig

ฉันใช้ BuildConfig.VERSION_NAME ในแอปพลิเคชันของฉัน

คุณยังสามารถใช้ BuildConfig.VERSION_CODE เพื่อรับรหัสเวอร์ชันได้

person cHAuHaN    schedule 23.06.2019

เข้าเกมช้า แต่คุณสามารถทำได้โดยไม่ต้อง @string/xyz โดยใช้ ?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
ฉันใช้แบบนี้:<Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference> แต่แสดงเป็น ?16843292เกิดอะไรขึ้น - person Suge; 26.09.2013
comment
ฉันไม่แน่ใจ แต่คิดว่านี่มีไว้สำหรับ API รุ่นหลังใช่ไหม - person Mafro34; 10.12.2013
comment
@PearsonArtPhoto จริง ๆ แล้วมันพูดแบบนั้นที่ไหน? - person Mafro34; 15.12.2013
comment
ใช้งานไม่ได้ ส่งคืนหมายเลขตลกซึ่ง @Suge ชี้ให้เห็นด้านบน - person pepan; 04.04.2017
comment
ไม่ทำงานเลยและส่งกลับค่าสุ่มตามที่โพสต์ก่อนหน้า - person A_rmas; 04.04.2017
comment
ตามที่ระบุไว้และเชื่อมโยง มันเป็นค่าคงที่ของ 16843292 (0x0101021c) ดังนั้นเหตุใด @suge จึงได้ค่าเฉพาะนั้น - person CrandellWS; 19.08.2018