android - 如何从App的(布局)XML变量中获取Manifest版本号?
我想有一种方法在代码的主要部分引用项目的清单版本号。 到目前为止我一直在做的是将String XML文件中的版本号链接到清单(@ string / Version)。 我想做的是反过来做,将字符串XML变量链接到清单中的版本。 原因? 我只想在一个位置更改清单文件中的版本号。 有没有办法做到这一点? 谢谢!
8个解决方案
354 votes
我相信这里已经回答了。
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
要么
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
Konstantin Burov answered 2019-04-13T21:14:14Z
97 votes
没有办法直接获得版本,但有两种解决办法可以完成。
版本可以存储在资源字符串中,并通过以下方式放入清单:
android.R.string.version
可以创建自定义视图,并将其放入XML中。 视图将使用它来指定名称:
android.R.string.version
这些解决方案中的任何一个都允许将版本名称放在XML中。 不幸的是,没有一个很好的简单解决方案,如android.R.string.version或类似的东西。
PearsonArtPhoto answered 2019-04-13T21:15:06Z
52 votes
您可以在XML资源中使用@string/versionName,例如活动布局。 首先在app/src/main/res/xml/preferences.xml中创建一个字符串资源,并在android节点中使用以下代码段:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
所以整个@string/versionName文件内容可能如下所示:
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'
}
然后,您可以在XML中使用@string/versionName。 Android Studio会将其标记为红色,但应用程序将编译没有问题。 例如,这可以在app/src/main/res/xml/preferences.xml中使用:
android:title="About"
android:key="pref_key_about">
android:key="pref_about_build"
android:title="Build version"
android:summary="@string/versionName" />
Arun Shankar answered 2019-04-13T21:15:44Z
15 votes
我通过扩展Preference类解决了这个问题。
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:
seastland answered 2019-04-13T21:16:15Z
9 votes
我使用BuildConfig.VERSION_NAME.toString();。从packageManager获取它有什么区别?
对不起,没有基于XML的解决方案对我有用。
Mullazman answered 2019-04-13T21:16:48Z
2 votes
您无法从XML中使用它。
您需要在XML中扩展您正在使用的小部件,并添加逻辑以使用Konstantin Burov的答案中提到的内容来设置文本。
Macarse answered 2019-04-13T21:17:22Z
1 votes
如果您使用的是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}"
}
}
现在根据需要在XML中使用.debug
在调试模式下,它将在链接文章中描述的版本名称中添加.debug。
CrandellWS answered 2019-04-13T21:18:07Z
-3 votes
游戏后期,但你可以通过使用?android:attr无需@string/xyz
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="?android:attr/versionName"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="?android:attr/versionCode"
/>
ddrscott answered 2019-04-13T21:18:33Z