如何从应用程序的(布局) XML 变量中获得清单版本号?

我想有一种方法来引用该项目的清单版本号在代码的主要部分。到目前为止,我一直在做的是将 String XML 文件中的版本号链接到清单(@String/Version)。我想做的是反过来做,将一个字符串 XML 变量链接到清单中的版本。为什么?我希望只需要在一个位置更改版本号,即清单文件。有什么办法吗?谢谢!

126109 次浏览

我相信那已经被回答 给你

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

或者

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;

不能从 XML 中使用它。

您需要扩展您在 XML 中使用的小部件,并添加逻辑来使用 Konstantin Burov 答案中提到的内容设置文本。

没有直接发布版本的方法,但是有两种解决方案可以使用。

  1. 版本可以存储在资源字符串中,并通过以下方式放置到清单中:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.somepackage"
    android:versionName="@string/version" android:versionCode="20">
    
  2. One could create a custom view, and place it into the XML. The view would use this to assign the name:

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

Either of these solutions would allow for placing the version name in XML. Unfortunately there isn't a nice simple solution, like android.R.string.version or something like that.

比赛后期,但你可以做到这一点没有 @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"
/>

我通过扩展 Preferences 类解决了这个问题。

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();。它和从软件包管理器获取它有什么区别?

对不起,基于 XML 的解决方案对我来说都不管用。

您可以在 XML 资源中使用 versionName,例如活动布局。首先在 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'
}

然后可以在 XML 中使用 @string/versionName。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>

如果您正在使用 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 中使用 @string/app_version

它将在调试模式下将 .debug添加到链接文章中描述的版本名称中。

最简单的解决方案是使用 BuildConfig

我在应用程序中使用 BuildConfig.VERSION_NAME

还可以使用 BuildConfig.VERSION_CODE获取版本代码。