ฉันต้องการมีวิธีอ้างอิงหมายเลขเวอร์ชันรายการของโครงการในส่วนหลักของโค้ด สิ่งที่ฉันทำจนถึงตอนนี้คือการเชื่อมโยงหมายเลขเวอร์ชันในไฟล์ String XML ไปยังรายการ (@string/Version) สิ่งที่ฉันต้องการทำคือทำในทางกลับกัน เชื่อมโยงตัวแปร XML สตริงกับเวอร์ชันในรายการ เหตุผล? ฉันต้องการเปลี่ยนหมายเลขเวอร์ชันในตำแหน่งเดียวเท่านั้น นั่นก็คือไฟล์ Manifest มีวิธีการทำเช่นนี้หรือไม่? ขอบคุณ!
คุณจะรับหมายเลขเวอร์ชัน Manifest จากตัวแปร XML (เค้าโครง) ของแอปได้อย่างไร
คำตอบ (9)
ฉันเชื่อว่ามีคำตอบแล้วที่นี่
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
OR
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
- person Aaron Klap; 12.07.2012
ไม่มีวิธีใดที่จะนำเวอร์ชันออกมาโดยตรง แต่มีวิธีแก้ไขสองประการที่สามารถทำได้
เวอร์ชันสามารถจัดเก็บไว้ในสตริงทรัพยากร และวางลงในรายการโดย:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.somepackage" android:versionName="@string/version" android:versionCode="20">
คุณสามารถสร้างมุมมองที่กำหนดเองและวางไว้ใน XML ได้ มุมมองจะใช้สิ่งนี้เพื่อกำหนดชื่อ:
context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
โซลูชันอย่างใดอย่างหนึ่งเหล่านี้จะอนุญาตให้วางชื่อเวอร์ชันในรูปแบบ XML น่าเสียดายที่ไม่มีวิธีแก้ปัญหาง่ายๆ ที่ดี เช่น android.R.string.version
หรืออะไรทำนองนั้น
The android:versionName cannot be a resource url, it must be a literal string
- person Griddo; 23.04.2013
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>
variant.resValue "string", "versionName", variant.versionName
ใน build.gradle
แล้วหรือยัง?
- person Arun Shankar; 06.11.2016
ฉันแก้ไขปัญหานี้โดยขยายคลาสการตั้งค่า
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>
หากคุณใช้ 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
ให้กับชื่อเวอร์ชันตามที่อธิบายในบทความที่เชื่อมโยงเมื่ออยู่ในโหมดแก้ไขข้อบกพร่อง
ฉันใช้ BuildConfig.VERSION_NAME.toString();
อะไรคือความแตกต่างระหว่างสิ่งนั้นกับการได้รับจาก packageManager?
ไม่มีโซลูชันที่ใช้ XML ที่เหมาะกับฉัน ขออภัย
คุณไม่สามารถใช้มันจาก XML
คุณต้องขยายวิดเจ็ตที่คุณใช้ใน XML และเพิ่มตรรกะเพื่อตั้งค่าข้อความโดยใช้สิ่งที่กล่าวถึงในคำตอบของ Konstantin Burov
วิธีแก้ปัญหาที่ง่ายที่สุดคือใช้ BuildConfig
ฉันใช้ BuildConfig.VERSION_NAME
ในแอปพลิเคชันของฉัน
คุณยังสามารถใช้ BuildConfig.VERSION_CODE
เพื่อรับรหัสเวอร์ชันได้
เข้าเกมช้า แต่คุณสามารถทำได้โดยไม่ต้อง @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"
/>
<Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>
แต่แสดงเป็น ?16843292
เกิดอะไรขึ้น
- person Suge; 26.09.2013