如何从应用程序(布局)XML变量中获取清单版本号?
-
11-10-2019 - |
题
我想在代码的主要部分中引用项目的清单版本编号。到目前为止,我一直在做的是将字符串XML文件中的版本编号链接到清单(@string/version)。我想做的是相反,将字符串XML变量链接到清单中的版本。原因?我只想在一个位置(清单文件)中更改版本号。有什么办法做到这一点吗?谢谢!
解决方案 2
没有办法直接取出版本,但是有两个可以完成的工作。
该版本可以存储在资源字符串中,并将其放入清单中:
<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
或类似的东西。
其他提示
我相信已经回答了 这里.
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
或者
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
您可以使用 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>
我通过扩展优先类解决了这个问题。
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>
我用 BuildConfig.VERSION_NAME.toString();
. 。从PackageManager获得它有什么区别?
抱歉,没有基于XML的解决方案对我有用。
如果您使用的是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
在调试模式下的链接文章中所述的版本名称。
您不能从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"
/>